From 4eff80454bb64e2fd93336cb021695f7453cd41a Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 17 May 2007 15:29:10 +0200 Subject: [PATCH] re PR rtl-optimization/31691 (optimized code taking the wrong branch) PR rtl-optimization/31691 * combine.c (simplify_set): Build a new src pattern instead of substituting its operands in the COMPARE case. From-SVN: r124797 --- gcc/ChangeLog | 6 +++ gcc/combine.c | 10 ++--- gcc/testsuite/ChangeLog | 4 ++ .../gcc.c-torture/execute/20070517-1.c | 41 +++++++++++++++++++ 4 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20070517-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 247a42d9b24..82861049ba5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-05-17 Eric Botcazou + + PR rtl-optimization/31691 + * combine.c (simplify_set): Build a new src pattern instead of + substituting its operands in the COMPARE case. + 2007-05-17 Zdenek Dvorak * tree-vrp.c (finalize_jump_threads): Do not care about dominance info. diff --git a/gcc/combine.c b/gcc/combine.c index 99da26da349..7589aac81da 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -5343,14 +5343,14 @@ simplify_set (rtx x) } else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx) { - SUBST(SET_SRC (x), op0); + SUBST (SET_SRC (x), op0); src = SET_SRC (x); } - else + /* Otherwise, update the COMPARE if needed. */ + else if (XEXP (src, 0) != op0 || XEXP (src, 1) != op1) { - /* Otherwise, update the COMPARE if needed. */ - SUBST (XEXP (src, 0), op0); - SUBST (XEXP (src, 1), op1); + SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1)); + src = SET_SRC (x); } } else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a78f6753b55..7a219b3c5c6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-05-17 Eric Botcazou + + * gcc.c-torture/execute/20070517-1.c: New test. + 2007-05-17 Daniel Franke PR fortran/31919 diff --git a/gcc/testsuite/gcc.c-torture/execute/20070517-1.c b/gcc/testsuite/gcc.c-torture/execute/20070517-1.c new file mode 100644 index 00000000000..c81cbc639be --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20070517-1.c @@ -0,0 +1,41 @@ +/* PR rtl-optimization/31691 */ +/* Origin: Chi-Hua Chen */ + +extern void abort (void); + +static int get_kind(int) __attribute__ ((noinline)); + +static int get_kind(int v) +{ + volatile int k = v; + return k; +} + +static int some_call(void) __attribute__ ((noinline)); + +static int some_call(void) +{ + return 0; +} + +static void example (int arg) +{ + int tmp, kind = get_kind (arg); + + if (kind == 9 || kind == 10 || kind == 5) + { + if (some_call() == 0) + { + if (kind == 9 || kind == 10) + tmp = arg; + else + abort(); + } + } +} + +int main(void) +{ + example(10); + return 0; +}