summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-09-17 00:15:49 +0200
committerAdam Nemet <nemet@gcc.gnu.org>2008-09-16 22:15:49 +0000
commitb5fb36eecd378fe4c880ba53d3025a32fd0aeab2 (patch)
tree024503185c3eb32872ed5a1b409891d4ebb4300c
parent8c50b4950276e667112e1999018ab792a9e24134 (diff)
downloadgcc-b5fb36eecd378fe4c880ba53d3025a32fd0aeab2.tar.gz
re PR rtl-optimization/37483 (Segfault in noce_try_sign_mask (ifcvt.c): b_unconditional)
PR rtl-optimization/37483 * ifcvt.c (noce_try_sign_mask): Use if_info->test_bb instead of if_info->insn_b's bb as argument to optimize_bb_for_speed_p. Rearrange code to better match the original comment. Check t_unconditional first. Improve comment. testsuite/ * gcc.c-torture/compile/pr37483.c: New test. * gcc.c-torture/compile/pr37395.c: New test. Co-Authored-By: Adam Nemet <anemet@caviumnetworks.com> From-SVN: r140403
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/ifcvt.c25
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr37395.c11
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr37483.c10
5 files changed, 51 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c4d91b6c901..e6238c23a97 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,13 @@
2008-09-16 Jakub Jelinek <jakub@redhat.com>
+ Adam Nemet <anemet@caviumnetworks.com>
+
+ PR rtl-optimization/37483
+ * ifcvt.c (noce_try_sign_mask): Use if_info->test_bb instead of
+ if_info->insn_b's bb as argument to optimize_bb_for_speed_p.
+ Rearrange code to better match the original comment. Check
+ t_unconditional first. Improve comment.
+
+2008-09-16 Jakub Jelinek <jakub@redhat.com>
PR c/37529
* gimplify.c (gimplify_expr) <case GOTO_EXPR>: If gimplification of
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 66a65a4a7ab..341174ab02f 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -1869,7 +1869,7 @@ noce_try_sign_mask (struct noce_if_info *if_info)
rtx cond, t, m, c, seq;
enum machine_mode mode;
enum rtx_code code;
- bool b_unconditional;
+ bool t_unconditional;
cond = if_info->cond;
code = GET_CODE (cond);
@@ -1898,16 +1898,19 @@ noce_try_sign_mask (struct noce_if_info *if_info)
if (GET_MODE (m) != mode)
return FALSE;
- /* This is only profitable if T is cheap, or T is unconditionally
- executed/evaluated in the original insn sequence. The latter
- happens if INSN_B was taken from TEST_BB, or if there was no
- INSN_B which can happen for e.g. conditional stores to memory. */
- b_unconditional = (if_info->insn_b == NULL_RTX
- || BLOCK_FOR_INSN (if_info->insn_b) == if_info->test_bb);
- if (rtx_cost (t, SET, optimize_bb_for_speed_p (BLOCK_FOR_INSN (if_info->insn_b)))
- >= COSTS_N_INSNS (2)
- && (!b_unconditional
- || t != if_info->b))
+ /* This is only profitable if T is unconditionally executed/evaluated in the
+ original insn sequence or T is cheap. The former happens if B is the
+ non-zero (T) value and if INSN_B was taken from TEST_BB, or there was no
+ INSN_B which can happen for e.g. conditional stores to memory. For the
+ cost computation use the block TEST_BB where the evaluation will end up
+ after the transformation. */
+ t_unconditional =
+ (t == if_info->b
+ && (if_info->insn_b == NULL_RTX
+ || BLOCK_FOR_INSN (if_info->insn_b) == if_info->test_bb));
+ if (!(t_unconditional
+ || (rtx_cost (t, SET, optimize_bb_for_speed_p (if_info->test_bb))
+ < COSTS_N_INSNS (2))))
return FALSE;
start_sequence ();
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 84d62d873e3..f1763d47fc7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,4 +1,11 @@
2008-09-16 Jakub Jelinek <jakub@redhat.com>
+ Adam Nemet <anemet@caviumnetworks.com>
+
+ PR rtl-optimization/37483
+ * gcc.c-torture/compile/pr37483.c: New test.
+ * gcc.c-torture/compile/pr37395.c: New test.
+
+2008-09-16 Jakub Jelinek <jakub@redhat.com>
PR c/37529
* gcc.dg/pr37529.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37395.c b/gcc/testsuite/gcc.c-torture/compile/pr37395.c
new file mode 100644
index 00000000000..e15b1543f3e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr37395.c
@@ -0,0 +1,11 @@
+/* PR target/37395 */
+
+int
+f (int j)
+{
+ int i;
+ asm volatile ("" : "=r"(i));
+ if (i >= 0)
+ j = 0;
+ return j;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37483.c b/gcc/testsuite/gcc.c-torture/compile/pr37483.c
new file mode 100644
index 00000000000..b0948925095
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr37483.c
@@ -0,0 +1,10 @@
+/* PR target/37483 */
+
+unsigned long long
+foo (unsigned count, int i)
+{
+ unsigned long long value;
+ if (i == 0)
+ value = (value & 0xFFFFFFFF) >> count;
+ return value;
+}