From c18605ccec6c240b67ecf2b4ce2700e7877bf94e Mon Sep 17 00:00:00 2001 From: Andreas Krebbel Date: Mon, 6 Sep 2010 14:20:31 +0000 Subject: [PATCH] combine.c (try_combine): Set subst_low_luid to i0. 2010-09-06 Andreas Krebbel * combine.c (try_combine): Set subst_low_luid to i0. 2010-09-06 Andreas Krebbel * gcc.dg/20100906-1.c: New testcase. From-SVN: r163917 --- gcc/ChangeLog | 4 +++ gcc/combine.c | 2 +- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.dg/20100906-1.c | 48 +++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/20100906-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c61e45836568..18893e72a5e9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2010-09-06 Andreas Krebbel + + * combine.c (try_combine): Set subst_low_luid to i0. + 2010-09-06 Richard Guenther * tree.def (MISALIGNED_INDIRECT_REF): Remove. diff --git a/gcc/combine.c b/gcc/combine.c index 4c9495808b9a..bed5768b03f1 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 4be2f9b95781..17ddd50214a4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-09-06 Andreas Krebbel + + * gcc.dg/20100906-1.c: New testcase. + 2010-09-06 Jakub Jelinek 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 000000000000..a6541e3ff843 --- /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; +}