re PR rtl-optimization/81553 (ICE in immed_wide_int_const, at emit-rtl.c:607)
authorJakub Jelinek <jakub@redhat.com>
Sat, 25 Nov 2017 19:35:47 +0000 (20:35 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 25 Nov 2017 19:35:47 +0000 (20:35 +0100)
PR rtl-optimization/81553
* combine.c (simplify_if_then_else): In (if_then_else COND (OP Z C1) Z)
to (OP Z (mult COND (C1 * STORE_FLAG_VALUE))) optimization, if OP
is a shift where C1 has different mode than the whole shift, use C1's
mode for MULT rather than the shift's mode.

* gcc.c-torture/compile/pr81553.c: New test.

From-SVN: r255150

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr81553.c [new file with mode: 0644]

index 5e8b5388b2022055b4cc0a9bee0ef94754d14c9c..3445e3e08ee9359b356977e1c9998c3cf64822c3 100644 (file)
@@ -1,5 +1,11 @@
 2017-11-25  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/81553
+       * combine.c (simplify_if_then_else): In (if_then_else COND (OP Z C1) Z)
+       to (OP Z (mult COND (C1 * STORE_FLAG_VALUE))) optimization, if OP
+       is a shift where C1 has different mode than the whole shift, use C1's
+       mode for MULT rather than the shift's mode.
+
        PR target/82848
        * config/rs6000/rs6000.c (rs6000_gimple_fold_builtin): Don't fold
        builtins not enabled in the currently selected ISA.
index ab515436fc857fcef354058d0535efb85e3a1887..0ce07511a3e351fd01d8f80ad6fe55298defc227 100644 (file)
@@ -6639,11 +6639,15 @@ simplify_if_then_else (rtx x)
 
       if (z)
        {
-         temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
+         machine_mode cm = m;
+         if ((op == ASHIFT || op == LSHIFTRT || op == ASHIFTRT)
+             && GET_MODE (c1) != VOIDmode)
+           cm = GET_MODE (c1);
+         temp = subst (simplify_gen_relational (true_code, cm, VOIDmode,
                                                 cond_op0, cond_op1),
                        pc_rtx, pc_rtx, 0, 0, 0);
-         temp = simplify_gen_binary (MULT, m, temp,
-                                     simplify_gen_binary (MULT, m, c1,
+         temp = simplify_gen_binary (MULT, cm, temp,
+                                     simplify_gen_binary (MULT, cm, c1,
                                                           const_true_rtx));
          temp = subst (temp, pc_rtx, pc_rtx, 0, 0, 0);
          temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
index 4c4b81eadabedd520e07f97c1993cfc1babf9e1b..f0169279cd1b490c0d0b5dcd225c4fd66119191f 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/81553
+       * gcc.c-torture/compile/pr81553.c: New test.
+
 2017-11-25  Andreas Schwab  <schwab@linux-m68k.org>
 
        * g++.dg/abi/structret1.C (FrameworkObject::action): Return a
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr81553.c b/gcc/testsuite/gcc.c-torture/compile/pr81553.c
new file mode 100644 (file)
index 0000000..ae33b16
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR rtl-optimization/81553 */
+
+int a, b, c, d;
+
+void
+foo (void)
+{
+  d = 1 >> c >> 1;
+  b = ~(209883449764912897ULL & d) << (0 >= a) | ~d;
+}