PR81285: Fix uninitialised variable in emit_store_flag_int
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 12 Sep 2017 13:27:13 +0000 (13:27 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 12 Sep 2017 13:27:13 +0000 (13:27 +0000)
2017-09-12  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
PR rtl-optimization/82185
* expmed.c (emit_store_flag_int): Only test tem if it has been
initialized.

From-SVN: r252008

gcc/ChangeLog
gcc/expmed.c

index bee3f99e90f31c7582d6673841aa00c04b288c81..267eabf58952b384b5497a93d0051d652e590c66 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-12  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR rtl-optimization/82185
+       * expmed.c (emit_store_flag_int): Only test tem if it has been
+       initialized.
+
 2017-09-12  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/82149
index 7f0cb0a0ec057a73891a6e208b55b6853e8bdc91..ca48c60683db749c1c9f11cd6f5d80cde699fdba 100644 (file)
@@ -5601,7 +5601,6 @@ emit_store_flag_int (rtx target, rtx subtarget, enum rtx_code code, rtx op0,
 {
   machine_mode target_mode = target ? GET_MODE (target) : VOIDmode;
   rtx_insn *last = get_last_insn ();
-  rtx tem;
 
   /* If this is an equality comparison of integers, we can try to exclusive-or
      (or subtract) the two operands and use a recursive call to try the
@@ -5610,8 +5609,8 @@ emit_store_flag_int (rtx target, rtx subtarget, enum rtx_code code, rtx op0,
 
   if ((code == EQ || code == NE) && op1 != const0_rtx)
     {
-      tem = expand_binop (mode, xor_optab, op0, op1, subtarget, 1,
-                         OPTAB_WIDEN);
+      rtx tem = expand_binop (mode, xor_optab, op0, op1, subtarget, 1,
+                             OPTAB_WIDEN);
 
       if (tem == 0)
        tem = expand_binop (mode, sub_optab, op0, op1, subtarget, 1,
@@ -5643,26 +5642,28 @@ emit_store_flag_int (rtx target, rtx subtarget, enum rtx_code code, rtx op0,
          && rtx_cost (GEN_INT (normalizep), mode, PLUS, 1,
                       optimize_insn_for_speed_p ()) == 0)
        {
-         tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
-                                  STORE_FLAG_VALUE, target_mode);
+         rtx tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
+                                      STORE_FLAG_VALUE, target_mode);
          if (tem != 0)
            tem = expand_binop (target_mode, add_optab, tem,
                                gen_int_mode (normalizep, target_mode),
                                target, 0, OPTAB_WIDEN);
+         if (tem != 0)
+           return tem;
        }
       else if (!want_add
               && rtx_cost (trueval, mode, XOR, 1,
                            optimize_insn_for_speed_p ()) == 0)
        {
-         tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
-                                  normalizep, target_mode);
+         rtx tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
+                                      normalizep, target_mode);
          if (tem != 0)
            tem = expand_binop (target_mode, xor_optab, tem, trueval, target,
                                INTVAL (trueval) >= 0, OPTAB_WIDEN);
+         if (tem != 0)
+           return tem;
        }
 
-      if (tem != 0)
-       return tem;
       delete_insns_since (last);
     }
 
@@ -5680,7 +5681,7 @@ emit_store_flag_int (rtx target, rtx subtarget, enum rtx_code code, rtx op0,
   /* Try to put the result of the comparison in the sign bit.  Assume we can't
      do the necessary operation below.  */
 
-  tem = 0;
+  rtx tem = 0;
 
   /* To see if A <= 0, compute (A | (A - 1)).  A <= 0 iff that result has
      the sign bit set.  */