From bad1c260cc73d1c2801323156a8c9db0b5e3cdac Mon Sep 17 00:00:00 2001 From: rsandifo Date: Tue, 12 Sep 2017 13:27:13 +0000 Subject: [PATCH] PR81285: Fix uninitialised variable in emit_store_flag_int 2017-09-12 Richard Sandiford gcc/ PR rtl-optimization/82185 * expmed.c (emit_store_flag_int): Only test tem if it has been initialized. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@252008 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/expmed.c | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bee3f99e90f..267eabf5895 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-09-12 Richard Sandiford + + PR rtl-optimization/82185 + * expmed.c (emit_store_flag_int): Only test tem if it has been + initialized. + 2017-09-12 Richard Biener PR middle-end/82149 diff --git a/gcc/expmed.c b/gcc/expmed.c index 7f0cb0a0ec0..ca48c60683d 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -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. */ -- 2.11.4.GIT