diff options
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/combine.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20100906-1.c | 48 |
4 files changed, 57 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c61e458..18893e72 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2010-09-06 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + + * combine.c (try_combine): Set subst_low_luid to i0. + 2010-09-06 Richard Guenther <rguenther@suse.de> * tree.def (MISALIGNED_INDIRECT_REF): Remove. diff --git a/gcc/combine.c b/gcc/combine.c index 4c94958..bed5768 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -3138,7 +3138,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p) } n_occurrences = 0; - subst_low_luid = DF_INSN_LUID (i1); + subst_low_luid = DF_INSN_LUID (i0); newpat = subst (newpat, i0dest, i0src, 0, i0_feeds_i1_n && i0dest_in_i0src); substed_i0 = 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4be2f9b..17ddd502 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-09-06 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + + * gcc.dg/20100906-1.c: New testcase. + 2010-09-06 Jakub Jelinek <jakub@redhat.com> PR testsuite/45543 diff --git a/gcc/testsuite/gcc.dg/20100906-1.c b/gcc/testsuite/gcc.dg/20100906-1.c new file mode 100644 index 0000000..a6541e3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20100906-1.c @@ -0,0 +1,48 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +/* This testcase got misoptimized by combine due to a wrong setting of + subst_low_luid in try_combine. */ + +enum rtx_code { + A, B +}; + +void abort (void); + +struct rtx_def { + __extension__ enum rtx_code code:16; +}; +typedef struct rtx_def *rtx; + +void __attribute__((noinline)) +add_constraint (unsigned char is_a) +{ + if (is_a) + abort (); +} + +void __attribute__((noinline)) +foo (rtx defn) +{ + switch (defn->code) + { + case A: + case B: + add_constraint (defn->code == A); + break; + default: + break; + } +} + +int +main () +{ + struct rtx_def r; + + r.code = B; + + foo (&r); + return 0; +} |