Commit 9219922e by Jeff Law Committed by Jeff Law

re PR tree-optimization/60902 (ffmpeg built with gcc 4.9 RC produces incorrect flac playback code)

	PR tree-optimization/60902
	* tree-ssa-threadedge.c
	(record_temporary_equivalences_from_stmts_at_dest): Make sure to
	invalidate outputs from statements that do not produce useful
	outputs for threading.

	PR tree-optimization/60902
	* gcc.target/i386/pr60902.c: New test.

From-SVN: r209716
parent 0e4d63c5
2014-04-23 Jeff Law <law@redhat.com>
PR tree-optimization/60902
* tree-ssa-threadedge.c
(record_temporary_equivalences_from_stmts_at_dest): Make sure to
invalidate outputs from statements that do not produce useful
outputs for threading.
2014-04-23 Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
* config/aarch64/aarch64.md (stack_protect_set, stack_protect_test)
......
2014-04-23 Jeff Law <law@redhat.com>
PR tree-optimization/60902
* gcc.target/i386/pr60902.c: New test.
2014-04-23 Alex Velenko <Alex.Velenko@arm.com>
* gcc.target/aarch64/vdup_lane_1.c: New testcase.
......
/* { dg-do run } */
/* { dg-options "-O2" } */
extern void abort ();
extern void exit (int);
int x;
foo()
{
static int count;
count++;
if (count > 1)
abort ();
}
static inline int
frob ()
{
int a;
__asm__ ("mov %1, %0\n\t" : "=r" (a) : "m" (x));
x++;
return a;
}
int
main ()
{
int i;
for (i = 0; i < 10 && frob () == 0; i++)
foo();
exit (0);
}
......@@ -387,7 +387,34 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
&& (gimple_code (stmt) != GIMPLE_CALL
|| gimple_call_lhs (stmt) == NULL_TREE
|| TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME))
continue;
{
/* STMT might still have DEFS and we need to invalidate any known
equivalences for them.
Consider if STMT is a GIMPLE_ASM with one or more outputs that
feeds a conditional inside a loop. We might derive an equivalence
due to the conditional. */
tree op;
ssa_op_iter iter;
if (backedge_seen)
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
{
/* This call only invalidates equivalences created by
PHI nodes. This is by design to keep the cost of
of invalidation reasonable. */
invalidate_equivalences (op, stack, src_map, dst_map);
/* However, conditionals can imply values for real
operands as well. And those won't be recorded in the
maps. In fact, those equivalences may be recorded totally
outside the threading code. We can just create a new
temporary NULL equivalence here. */
record_temporary_equivalence (op, NULL_TREE, stack);
}
continue;
}
/* The result of __builtin_object_size depends on all the arguments
of a phi node. Temporarily using only one edge produces invalid
......
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