aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@gcc.gnu.org>2002-05-03 13:34:31 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-05-03 13:34:31 -0700
commitb548220837d0386f470b48d1318b7c005d38aa3c (patch)
tree892b45fd16cf2c42639551c3f8013562fae34414
parentba2e86d69defc0b4d0e63cd2c202110f194b8720 (diff)
downloadgcc-b548220837d0386f470b48d1318b7c005d38aa3c.zip
gcc-b548220837d0386f470b48d1318b7c005d38aa3c.tar.gz
gcc-b548220837d0386f470b48d1318b7c005d38aa3c.tar.bz2
ifcvt.c (noce_try_store_flag, [...]): Insert new code before JUMP, not EARLIEST.
* ifcvt.c (noce_try_store_flag, noce_try_store_flag_constants, noce_try_store_flag_inc, noce_try_store_flag_mask, noce_try_cmove, noce_try_cmove_arith, noce_try_minmax, noce_try_abs): Insert new code before JUMP, not EARLIEST. From-SVN: r53123
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/ifcvt.c18
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020503-1.c31
3 files changed, 51 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 33029bb..6e53aa4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2002-05-03 Richard Henderson <rth@redhat.com>
+
+ PR opt/6534
+ * ifcvt.c (noce_try_store_flag, noce_try_store_flag_constants,
+ noce_try_store_flag_inc, noce_try_store_flag_mask, noce_try_cmove,
+ noce_try_cmove_arith, noce_try_minmax, noce_try_abs): Insert new
+ code before JUMP, not EARLIEST.
+
2002-05-03 Joseph S. Myers <jsm28@cam.ac.uk>
* c-format.c (check_format_info_main): Don't check for presence of
@@ -147,10 +155,10 @@ Thu May 2 19:50:04 CEST 2002 Jan Hubicka <jh@suse.cz>
2002-05-02 Aldy Hernandez <aldyh@redhat.com>
- * gcc.dg/altivec-8.c: New.
+ * gcc.dg/altivec-8.c: New.
- * config/rs6000/rs6000.c (rs6000_legitimate_address): Disallow
- PRE_INC and PRE_DEC for altivec modes.
+ * config/rs6000/rs6000.c (rs6000_legitimate_address): Disallow
+ PRE_INC and PRE_DEC for altivec modes.
2002-05-01 Bruce Korb <bkorb@gnu.org>
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index f46a6cf..e8c2b5f 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -620,7 +620,7 @@ noce_try_store_flag (if_info)
seq = get_insns ();
end_sequence ();
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
@@ -755,7 +755,7 @@ noce_try_store_flag_constants (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
@@ -815,7 +815,7 @@ noce_try_store_flag_inc (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
@@ -867,7 +867,7 @@ noce_try_store_flag_mask (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
@@ -962,7 +962,7 @@ noce_try_cmove (if_info)
seq = get_insns ();
end_sequence ();
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
else
@@ -1124,7 +1124,7 @@ noce_try_cmove_arith (if_info)
tmp = get_insns ();
end_sequence ();
- emit_insns_before (tmp, if_info->cond_earliest);
+ emit_insns_before (tmp, if_info->jump);
return TRUE;
end_seq_and_fail:
@@ -1376,7 +1376,7 @@ noce_try_minmax (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, earliest);
+ emit_insns_before (seq, if_info->jump);
if_info->cond = cond;
if_info->cond_earliest = earliest;
@@ -1494,7 +1494,7 @@ noce_try_abs (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, earliest);
+ emit_insns_before (seq, if_info->jump);
if_info->cond = cond;
if_info->cond_earliest = earliest;
@@ -1753,7 +1753,7 @@ noce_process_if_block (test_bb, then_bb, else_bb, join_bb)
if (insn_b && else_bb)
delete_insn (insn_b);
- /* The new insns will have been inserted before cond_earliest. We should
+ /* The new insns will have been inserted just before the jump. We should
be able to remove the jump with impunity, but the condition itself may
have been modified by gcse to be shared across basic blocks. */
delete_insn (jump);
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020503-1.c b/gcc/testsuite/gcc.c-torture/execute/20020503-1.c
new file mode 100644
index 0000000..6d45ca0
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20020503-1.c
@@ -0,0 +1,31 @@
+/* PR 6534 */
+/* GCSE unified the two i<0 tests, but if-conversion to ui=abs(i)
+ insertted the code at the wrong place corrupting the i<0 test. */
+
+void abort (void);
+static char *
+inttostr (long i, char buf[128])
+{
+ unsigned long ui = i;
+ char *p = buf + 127;
+ *p = '\0';
+ if (i < 0)
+ ui = -ui;
+ do
+ *--p = '0' + ui % 10;
+ while ((ui /= 10) != 0);
+ if (i < 0)
+ *--p = '-';
+ return p;
+}
+
+int
+main ()
+{
+ char buf[128], *p;
+
+ p = inttostr (-1, buf);
+ if (*p != '-')
+ abort ();
+ return 0;
+}