From e69cdc1237a4be0650026452ee57b886f1b1dbbe Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sun, 2 Nov 2003 09:32:23 +0100 Subject: [PATCH] re PR rtl-optimization/12799 (faulty mov->add change clobbers the CC register) PR optimization/12799 * postreload.c (reload_cse_move2add): Generate the add2 patterns manually. From-SVN: r73195 --- gcc/ChangeLog | 6 +++++ gcc/postreload.c | 23 +++++++++---------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/20031102-1.c | 37 +++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/20031102-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 01a5a567b59..515b5900703 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-11-02 Eric Botcazou + + PR optimization/12799 + * postreload.c (reload_cse_move2add): Generate the add2 + patterns manually. + 2003-11-02 Eric Botcazou * config/sparc/sparc.c (function_arg_partial_nregs) [TARGET_ARCH64]: diff --git a/gcc/postreload.c b/gcc/postreload.c index 362b50ebc13..b55c4476f2d 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -1199,14 +1199,12 @@ reload_cse_move2add (rtx first) else if (rtx_cost (new_src, PLUS) < rtx_cost (src, SET) && have_add2_insn (reg, new_src)) { - rtx newpat = gen_add2_insn (reg, new_src); - if (INSN_P (newpat) && NEXT_INSN (newpat) == NULL_RTX) - newpat = PATTERN (newpat); - /* If it was the first insn of a sequence or - some other emitted insn, validate_change will - reject it. */ - validate_change (insn, &PATTERN (insn), - newpat, 0); + rtx newpat = gen_rtx_SET (VOIDmode, + reg, + gen_rtx_PLUS (GET_MODE (reg), + reg, + new_src)); + validate_change (insn, &PATTERN (insn), newpat, 0); } else { @@ -1288,10 +1286,11 @@ reload_cse_move2add (rtx first) < COSTS_N_INSNS (1) + rtx_cost (src3, SET)) && have_add2_insn (reg, new_src)) { - rtx newpat = gen_add2_insn (reg, new_src); - if (INSN_P (newpat) - && NEXT_INSN (newpat) == NULL_RTX) - newpat = PATTERN (newpat); + rtx newpat = gen_rtx_SET (VOIDmode, + reg, + gen_rtx_PLUS (GET_MODE (reg), + reg, + new_src)); success = validate_change (next, &PATTERN (next), newpat, 0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 599563b14f2..be2cc850cf2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-11-02 Eric Botcazou + + * gcc.dg/20031102-1.c: New test. + 2003-11-02 Eric Botcazou * gcc.dg/complex-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/20031102-1.c b/gcc/testsuite/gcc.dg/20031102-1.c new file mode 100644 index 00000000000..4da4e6a8cc0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20031102-1.c @@ -0,0 +1,37 @@ +/* PR optimization/12799 */ +/* Origin: Pratap Subrahmanyam */ + +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-options "-O2 -march=i686" { target i686-*-* } } */ + +/* Verify that reload_cse_move2add doesn't add unexpected CLOBBERs. */ + +extern void abort(void); + +int loo = 1; + +__inline__ char InlineFunc(void) +{ + return __builtin_expect(!!(loo == 1), 1); +} + +int FooBar(void) +{ + int i; + int var1 = InlineFunc() ? 2046 : 1023; + int var2 = InlineFunc() ? 512 : 1024; + + for (i = 0; i < var1; i++) + ; + + if (InlineFunc() && var2 != 512) + abort(); + + return 0; +} + +int main(void) +{ + return FooBar(); +} -- 2.30.2