Commit abc0647a by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/70593 (Miscompilation of xen starting with r226901)

	PR middle-end/70593
	* tree-ssa-coalesce.c (build_ssa_conflict_graph): For stmt
	with multiple SSA_NAME defs, force the outputs other than first
	to be live before calling live_track_process_def on each output.

	* gcc.target/i386/pr70593.c: New test.

From-SVN: r234834
parent 1a13c0a2
2016-04-08 Jakub Jelinek <jakub@redhat.com>
PR middle-end/70593
* tree-ssa-coalesce.c (build_ssa_conflict_graph): For stmt
with multiple SSA_NAME defs, force the outputs other than first
to be live before calling live_track_process_def on each output.
PR rtl-optimization/70574
* fwprop.c (forward_propagate_and_simplify): Don't add
REG_EQUAL note if DF_REF_REG (use) is a paradoxical subreg.
......
2016-04-08 Jakub Jelinek <jakub@redhat.com>
PR middle-end/70593
* gcc.target/i386/pr70593.c: New test.
PR rtl-optimization/70574
* gcc.target/i386/avx2-pr70574.c: New test.
......
/* PR middle-end/70593 */
/* { dg-do run } */
/* { dg-options "-O2" } */
__attribute__((noinline, noclone)) unsigned long
foo (unsigned x)
{
unsigned long a, c = x;
asm volatile ("xorl\t%k1, %k1\n\tmovl\t$7, %k0" : "=c" (c), "=a" (a) : "0" (c), "1" (c) : "memory");
return c;
}
int
main ()
{
if (foo (3) != 7)
__builtin_abort ();
return 0;
}
......@@ -906,6 +906,23 @@ build_ssa_conflict_graph (tree_live_info_p liveinfo)
else if (is_gimple_debug (stmt))
continue;
/* For stmts with more than one SSA_NAME definition pretend all the
SSA_NAME outputs but the first one are live at this point, so
that conflicts are added in between all those even when they are
actually not really live after the asm, because expansion might
copy those into pseudos after the asm and if multiple outputs
share the same partition, it might overwrite those that should
be live. E.g.
asm volatile (".." : "=r" (a) : "=r" (b) : "0" (a), "1" (a));
return a;
See PR70593. */
bool first = true;
FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_DEF)
if (first)
first = false;
else
live_track_process_use (live, var);
FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_DEF)
live_track_process_def (live, var, graph);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment