From: Jakub Jelinek Date: Tue, 16 Sep 2008 22:15:49 +0000 (+0200) Subject: re PR rtl-optimization/37483 (Segfault in noce_try_sign_mask (ifcvt.c): b_unconditional) X-Git-Tag: releases/gcc-4.4.0~2417 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b5fb36eecd378fe4c880ba53d3025a32fd0aeab2;p=thirdparty%2Fgcc.git 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 From-SVN: r140403 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c4d91b6c901f..e6238c23a97c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2008-09-16 Jakub Jelinek + Adam Nemet + + 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 PR c/37529 diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 66a65a4a7ab3..341174ab02fe 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 84d62d873e31..f1763d47fc7b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-09-16 Jakub Jelinek + Adam Nemet + + 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 PR c/37529 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 000000000000..e15b1543f3e2 --- /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 000000000000..b09489250954 --- /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; +}