re PR middle-end/79909 (ICE error: invalid rtl sharing found in the insn on ppc64le)

PR rtl-optimization/79909
	* combine.c (try_combine): Use simplify_replace_rtx on individual
	CALL_INSN_FUNCTION_USAGE elements instead of replace_rtx on copy_rtx
	of the whole CALL_INSN_FUNCTION_USAGE.

	* gcc.target/powerpc/pr79909.c: New test.

From-SVN: r246023
This commit is contained in:
Jakub Jelinek 2017-03-10 08:57:45 +01:00 committed by Jakub Jelinek
parent 72772e6761
commit 2d9dd4fb86
4 changed files with 38 additions and 18 deletions

View File

@ -1,5 +1,10 @@
2017-03-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/79909
* combine.c (try_combine): Use simplify_replace_rtx on individual
CALL_INSN_FUNCTION_USAGE elements instead of replace_rtx on copy_rtx
of the whole CALL_INSN_FUNCTION_USAGE.
PR tree-optimization/79972
* gimple-ssa-warn-alloca.c (alloca_call_type): Only call
get_range_info on SSA_NAMEs. Formatting fixes.

View File

@ -4293,26 +4293,25 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
{
rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
reset_used_flags (call_usage);
call_usage = copy_rtx (call_usage);
if (substed_i2)
for (rtx link = CALL_INSN_FUNCTION_USAGE (i3); link;
link = XEXP (link, 1))
{
/* I2SRC must still be meaningful at this point. Some splitting
operations can invalidate I2SRC, but those operations do not
apply to calls. */
gcc_assert (i2src);
replace_rtx (call_usage, i2dest, i2src);
if (substed_i2)
{
/* I2SRC must still be meaningful at this point. Some
splitting operations can invalidate I2SRC, but those
operations do not apply to calls. */
gcc_assert (i2src);
XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
i2dest, i2src);
}
if (substed_i1)
XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
i1dest, i1src);
if (substed_i0)
XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
i0dest, i0src);
}
if (substed_i1)
replace_rtx (call_usage, i1dest, i1src);
if (substed_i0)
replace_rtx (call_usage, i0dest, i0src);
CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
}
if (undobuf.other_insn)

View File

@ -1,5 +1,8 @@
2017-03-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/79909
* gcc.target/powerpc/pr79909.c: New test.
PR tree-optimization/79972
* gcc.dg/pr79972.c: New test.

View File

@ -0,0 +1,13 @@
/* PR rtl-optimization/79909 */
/* { dg-do compile } */
/* { dg-options "-O2 -mxl-compat" } */
typedef float T __attribute__ ((mode (TD)));
T b, c, d, e, f, g;
void bar (T, T, T, T, T, T);
void
foo (void)
{
bar (e, b, f, c, g, d);
}