re PR c/5420 (bad code generated with gcc3.1/ia64)

PR c/5420:
	* c-common.c (c_unsafe_for_reeval): Make COMPOUND_LITERAL_EXPR
	unsafe for reevaluation.

	* gcc.c-torture/execute/20020206-2.c: New test.

From-SVN: r49550
This commit is contained in:
Jakub Jelinek 2002-02-06 20:37:31 +01:00 committed by Jakub Jelinek
parent d512928893
commit caaf2272c0
4 changed files with 36 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2002-02-06 Jakub Jelinek <jakub@redhat.com>
PR c/5420:
* c-common.c (c_unsafe_for_reeval): Make COMPOUND_LITERAL_EXPR
unsafe for reevaluation.
2002-02-06 Jakub Jelinek <jakub@redhat.com>
PR c/5482:

View File

@ -3567,8 +3567,10 @@ int
c_unsafe_for_reeval (exp)
tree exp;
{
/* Statement expressions may not be reevaluated. */
if (TREE_CODE (exp) == STMT_EXPR)
/* Statement expressions may not be reevaluated, likewise compound
literals. */
if (TREE_CODE (exp) == STMT_EXPR
|| TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
return 2;
/* Walk all other expressions. */

View File

@ -2,6 +2,8 @@
* gcc.c-torture/execute/20020206-1.c: New test.
* gcc.c-torture/execute/20020206-2.c: New test.
PR optimization/5429:
* gcc.c-torture/compile/20020206-1.c: New test.

View File

@ -0,0 +1,24 @@
/* Origin: PR c/5420 from David Mosberger <davidm@hpl.hp.com>.
This testcase was miscompiled when tail call optimizing, because a
compound literal initialization was emitted only in the tail call insn
chain, not in the normal call insn chain. */
typedef struct { unsigned short a; } A;
extern void abort (void);
extern void exit (int);
void foo (unsigned int x)
{
if (x != 0x800 && x != 0x810)
abort ();
}
int
main (int argc, char **argv)
{
int i;
for (i = 0; i < 2; ++i)
foo (((A) { ((!(i >> 4) ? 8 : 64 + (i >> 4)) << 8) + (i << 4) } ).a);
exit (0);
}