On Tue, Apr 28, 2020 at 11:44:58AM +0200, Richard Biener wrote: > On Tue, Apr 28, 2020 at 11:28 AM Stefan Schulze Frielinghaus via > Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > > > While bootstrapping GCC on S/390 the following warning/error is raised: > > > > gcc/var-tracking.c:10239:34: error: 'pre' may be used uninitialized in this > > function [-Werror=maybe-uninitialized] > > 10239 | VTI (bb)->out.stack_adjust += pre; > > | ^ > > > > The lines of interest are: > > > > HOST_WIDE_INT pre, post = 0; > > // ... > > if (!frame_pointer_needed) > > { > > insn_stack_adjust_offset_pre_post (insn, &pre, &post); > > // ... > > } > > > > // ... > > adjust_insn (bb, insn); > > > > if (!frame_pointer_needed && pre) > > VTI (bb)->out.stack_adjust += pre; > > > > Both if statements depend on global variable frame_pointer_needed. In > > function > > insn_stack_adjust_offset_pre_post local variable pre is initialized. The > > problematic part is the function call between both if statements. Since > > adjust_insn also calls functions which are defined in a different > > compilation > > unit, we are not able to prove that global variable frame_pointer_needed is > > not > > altered by adjust_insn and its siblings. Thus we must assume that > > frame_pointer_needed may be true before the call and false afterwards which > > renders the warning true (admitted the location hint is not totally > > perfect). > > By initialising pre we silence the warning. > > > > Bootstrapped and regtested on S/390. Ok for master? > > I think even better would be to move the pre declaration inside > > FOR_BB_INSNS_SAFE (bb, insn, next) > { > if (INSN_P (insn)) > { > > initialized with zero and then elide the !frame_pointer_needed part > of > > if (!frame_pointer_needed && pre) > > can you check that works? OK if it does.
That works, too. Removed !frame_pointer_needed from pre as well as post part of the two if statements. Please find attached an updated version of the patch. Regtest is running over night. Assuming it succeeds I will push if no one objects.
While bootstrapping GCC on S/390 the following warning/error is raised: gcc/var-tracking.c:10239:34: error: 'pre' may be used uninitialized in this function [-Werror=maybe-uninitialized] 10239 | VTI (bb)->out.stack_adjust += pre; | ^ The lines of interest are: HOST_WIDE_INT pre, post = 0; // ... if (!frame_pointer_needed) { insn_stack_adjust_offset_pre_post (insn, &pre, &post); // ... } // ... adjust_insn (bb, insn); if (!frame_pointer_needed && pre) VTI (bb)->out.stack_adjust += pre; Both if statements depend on global variable frame_pointer_needed. In function insn_stack_adjust_offset_pre_post local variable pre is initialized. The problematic part is the function call between both if statements. Since adjust_insn also calls functions which are defined in a different compilation unit, we are not able to prove that global variable frame_pointer_needed is not altered by adjust_insn and its siblings. Thus we must assume that frame_pointer_needed may be true before the call and false afterwards which renders the warning true (admitted the location hint is not totally perfect). By initialising pre we silence the warning. gcc/ChangeLog: 2020-04-28 Stefan Schulze Frielinghaus <stefa...@linux.ibm.com> * var-tracking.c (vt_initialize): Move variables pre and post into inner block and initialize both in order to fix warning about uninitialized use. Remove unnecessary checks for frame_pointer_needed. --- gcc/var-tracking.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 0d39326aa63..fc861a0d8ce 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -10171,7 +10171,6 @@ vt_initialize (void) FOR_EACH_BB_FN (bb, cfun) { rtx_insn *insn; - HOST_WIDE_INT pre, post = 0; basic_block first_bb, last_bb; if (MAY_HAVE_DEBUG_BIND_INSNS) @@ -10216,6 +10215,8 @@ vt_initialize (void) { if (INSN_P (insn)) { + HOST_WIDE_INT pre = 0, post = 0; + if (!frame_pointer_needed) { insn_stack_adjust_offset_pre_post (insn, &pre, &post); @@ -10235,7 +10236,7 @@ vt_initialize (void) cselib_hook_called = false; adjust_insn (bb, insn); - if (!frame_pointer_needed && pre) + if (pre) VTI (bb)->out.stack_adjust += pre; if (DEBUG_MARKER_INSN_P (insn)) @@ -10262,7 +10263,7 @@ vt_initialize (void) add_with_sets (insn, 0, 0); cancel_changes (0); - if (!frame_pointer_needed && post) + if (post) { micro_operation mo; mo.type = MO_ADJUST; -- 2.25.3