re PR target/79079 ([6] Wrong code gen for __builtin_mul_overflow when TRULY_NOOP_TRU...
authorKito Cheng <kito.cheng@gmail.com>
Tue, 17 Jan 2017 16:56:30 +0000 (16:56 +0000)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 17 Jan 2017 16:56:30 +0000 (17:56 +0100)
PR target/79079
* internal-fn.c (expand_mul_overflow): Use convert_modes instead of
gen_lowpart.

Co-Authored-By: Kuan-Lin Chen <kuanlinchentw@gmail.com>
From-SVN: r244539

gcc/ChangeLog
gcc/internal-fn.c

index cc05d2c9c2c55e59ff9a7aecd8de59563658870d..6530fd1de995336c5fb2ce124748c3e5724582a9 100644 (file)
@@ -1,3 +1,10 @@
+2017-01-17  Kito Cheng  <kito.cheng@gmail.com>
+            Kuan-Lin Chen  <kuanlinchentw@gmail.com>
+
+       PR target/79079
+       * internal-fn.c (expand_mul_overflow): Use convert_modes instead of
+       gen_lowpart.
+
 2017-01-17  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR target/79058
index 7fb44aa08fec3085764cc8c0a7531295a587af8b..5d71cb2e08dedce82b4f27efff0b66f774e3a793 100644 (file)
@@ -1483,8 +1483,8 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
          res = expand_expr_real_2 (&ops, NULL_RTX, wmode, EXPAND_NORMAL);
          rtx hipart = expand_shift (RSHIFT_EXPR, wmode, res, prec,
                                     NULL_RTX, uns);
-         hipart = gen_lowpart (mode, hipart);
-         res = gen_lowpart (mode, res);
+         hipart = convert_modes (mode, wmode, hipart, uns);
+         res = convert_modes (mode, wmode, res, uns);
          if (uns)
            /* For the unsigned multiplication, there was overflow if
               HIPART is non-zero.  */
@@ -1517,16 +1517,16 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
          unsigned int hprec = GET_MODE_PRECISION (hmode);
          rtx hipart0 = expand_shift (RSHIFT_EXPR, mode, op0, hprec,
                                      NULL_RTX, uns);
-         hipart0 = gen_lowpart (hmode, hipart0);
-         rtx lopart0 = gen_lowpart (hmode, op0);
+         hipart0 = convert_modes (hmode, mode, hipart0, uns);
+         rtx lopart0 = convert_modes (hmode, mode, op0, uns);
          rtx signbit0 = const0_rtx;
          if (!uns)
            signbit0 = expand_shift (RSHIFT_EXPR, hmode, lopart0, hprec - 1,
                                     NULL_RTX, 0);
          rtx hipart1 = expand_shift (RSHIFT_EXPR, mode, op1, hprec,
                                      NULL_RTX, uns);
-         hipart1 = gen_lowpart (hmode, hipart1);
-         rtx lopart1 = gen_lowpart (hmode, op1);
+         hipart1 = convert_modes (hmode, mode, hipart1, uns);
+         rtx lopart1 = convert_modes (hmode, mode, op1, uns);
          rtx signbit1 = const0_rtx;
          if (!uns)
            signbit1 = expand_shift (RSHIFT_EXPR, hmode, lopart1, hprec - 1,
@@ -1717,11 +1717,12 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
             if (loxhi >> (bitsize / 2) == 0             (if uns).  */
          rtx hipartloxhi = expand_shift (RSHIFT_EXPR, mode, loxhi, hprec,
                                          NULL_RTX, 0);
-         hipartloxhi = gen_lowpart (hmode, hipartloxhi);
+         hipartloxhi = convert_modes (hmode, mode, hipartloxhi, 0);
          rtx signbitloxhi = const0_rtx;
          if (!uns)
            signbitloxhi = expand_shift (RSHIFT_EXPR, hmode,
-                                        gen_lowpart (hmode, loxhi),
+                                        convert_modes (hmode, mode,
+                                                       loxhi, 0),
                                         hprec - 1, NULL_RTX, 0);
 
          do_compare_rtx_and_jump (signbitloxhi, hipartloxhi, NE, true, hmode,
@@ -1731,7 +1732,8 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
          /* res = (loxhi << (bitsize / 2)) | (hmode) lo0xlo1;  */
          rtx loxhishifted = expand_shift (LSHIFT_EXPR, mode, loxhi, hprec,
                                           NULL_RTX, 1);
-         tem = convert_modes (mode, hmode, gen_lowpart (hmode, lo0xlo1), 1);
+         tem = convert_modes (mode, hmode,
+                              convert_modes (hmode, mode, lo0xlo1, 1), 1);
 
          tem = expand_simple_binop (mode, IOR, loxhishifted, tem, res,
                                     1, OPTAB_DIRECT);