Handle a null lhs in expand_direct_optab_fn (PR85862)
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 22 May 2018 12:25:44 +0000 (12:25 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 22 May 2018 12:25:44 +0000 (12:25 +0000)
This PR showed that the normal function for expanding directly-mapped
internal functions didn't handle the case in which the call was only
being kept for its side-effects.

2018-05-22  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
PR middle-end/85862
* internal-fn.c (expand_direct_optab_fn): Cope with a null lhs.

gcc/testsuite/
PR middle-end/85862
* gcc.dg/torture/pr85862.c: New test.

From-SVN: r260504

gcc/ChangeLog
gcc/internal-fn.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr85862.c [new file with mode: 0644]

index fd57840aa4b01c7e6efa8b0b590f9a01c82a378e..5e09013ad6465c37b59ad2b7a5db721fa356515e 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-22  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR middle-end/85862
+       * internal-fn.c (expand_direct_optab_fn): Cope with a null lhs.
+
 2018-05-22  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/85834
index b2c4a319a531e2b968494ca173bed143750e9538..bb4404ed2909499df502b696f68924d900f17e76 100644 (file)
@@ -2891,14 +2891,15 @@ expand_direct_optab_fn (internal_fn fn, gcall *stmt, direct_optab optab,
   insn_code icode = direct_optab_handler (optab, TYPE_MODE (types.first));
 
   tree lhs = gimple_call_lhs (stmt);
-  tree lhs_type = TREE_TYPE (lhs);
-  rtx lhs_rtx = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
+  rtx lhs_rtx = NULL_RTX;
+  if (lhs)
+    lhs_rtx = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
 
   /* Do not assign directly to a promoted subreg, since there is no
      guarantee that the instruction will leave the upper bits of the
      register in the state required by SUBREG_PROMOTED_SIGN.  */
   rtx dest = lhs_rtx;
-  if (GET_CODE (dest) == SUBREG && SUBREG_PROMOTED_VAR_P (dest))
+  if (dest && GET_CODE (dest) == SUBREG && SUBREG_PROMOTED_VAR_P (dest))
     dest = NULL_RTX;
 
   create_output_operand (&ops[0], dest, insn_data[icode].operand[0].mode);
@@ -2917,7 +2918,7 @@ expand_direct_optab_fn (internal_fn fn, gcall *stmt, direct_optab optab,
     }
 
   expand_insn (icode, nargs + 1, ops);
-  if (!rtx_equal_p (lhs_rtx, ops[0].value))
+  if (lhs_rtx && !rtx_equal_p (lhs_rtx, ops[0].value))
     {
       /* If the return value has an integral type, convert the instruction
         result to that type.  This is useful for things that return an
@@ -2931,7 +2932,7 @@ expand_direct_optab_fn (internal_fn fn, gcall *stmt, direct_optab optab,
          /* If this is a scalar in a register that is stored in a wider
             mode than the declared mode, compute the result into its
             declared mode and then convert to the wider mode.  */
-         gcc_checking_assert (INTEGRAL_TYPE_P (lhs_type));
+         gcc_checking_assert (INTEGRAL_TYPE_P (TREE_TYPE (lhs)));
          rtx tmp = convert_to_mode (GET_MODE (lhs_rtx), ops[0].value, 0);
          convert_move (SUBREG_REG (lhs_rtx), tmp,
                        SUBREG_PROMOTED_SIGN (lhs_rtx));
@@ -2940,7 +2941,7 @@ expand_direct_optab_fn (internal_fn fn, gcall *stmt, direct_optab optab,
        emit_move_insn (lhs_rtx, ops[0].value);
       else
        {
-         gcc_checking_assert (INTEGRAL_TYPE_P (lhs_type));
+         gcc_checking_assert (INTEGRAL_TYPE_P (TREE_TYPE (lhs)));
          convert_move (lhs_rtx, ops[0].value, 0);
        }
     }
index 9083376af9e1a38dd48533d4e0793f2b745dce3b..489941c617b6c922d385e4b3b4248aa6fef186cc 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-22  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR middle-end/85862
+       * gcc.dg/torture/pr85862.c: New test.
+
 2018-05-22  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/85834
diff --git a/gcc/testsuite/gcc.dg/torture/pr85862.c b/gcc/testsuite/gcc.dg/torture/pr85862.c
new file mode 100644 (file)
index 0000000..39995bc
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fexceptions -fnon-call-exceptions" } */
+/* { dg-additional-options "-fexceptions -fnon-call-exceptions -mfma" { target i?86-*-* x86_64-*-* } } */
+
+void
+ki (double nq)
+{
+  double no = 1.1 * nq - nq;
+}