summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2003-11-02 08:32:23 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2003-11-02 08:32:23 +0000
commitdf41fe2ee93d13e2e6f7f9eb5565417636525297 (patch)
treef9f98447bfc855ed01ad956bcc0821924a93fa02 /gcc
parentcc7530fdf232c93cc219eabe7e52a17f2022b88d (diff)
downloadgcc-df41fe2ee93d13e2e6f7f9eb5565417636525297.tar.gz
PR optimization/12799
* postreload.c (reload_cse_move2add): Generate the add2 patterns manually. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73195 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/postreload.c23
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/20031102-1.c37
4 files changed, 58 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01a5a567b59..515b5900703 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2003-11-02 Eric Botcazou <ebotcazou@libertysurf.fr>
+ PR optimization/12799
+ * postreload.c (reload_cse_move2add): Generate the add2
+ patterns manually.
+
+2003-11-02 Eric Botcazou <ebotcazou@libertysurf.fr>
+
* config/sparc/sparc.c (function_arg_partial_nregs) [TARGET_ARCH64]:
Return 0 for all complex modes whose size is lesser or equal to
a word. Add a ??? comment for the condition used with 16-byte
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,5 +1,9 @@
2003-11-02 Eric Botcazou <ebotcazou@libertysurf.fr>
+ * gcc.dg/20031102-1.c: New test.
+
+2003-11-02 Eric Botcazou <ebotcazou@libertysurf.fr>
+
* gcc.dg/complex-1.c: New test.
2003-11-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
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 <pratap@vmware.com> */
+
+/* { 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();
+}