var-tracking.c: Fix possible use of uninitialized variable pre
authorStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Sun, 26 Apr 2020 15:10:51 +0000 (17:10 +0200)
committerStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Thu, 30 Apr 2020 06:12:42 +0000 (08:12 +0200)
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-30  Stefan Schulze Frielinghaus  <stefansf@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/ChangeLog
gcc/var-tracking.c

index 8abb4c0eda423704cd31178264d4944fe2f1a303..563d42cc694653d1feaa32880be6ee3d2b21d4ab 100644 (file)
@@ -1,3 +1,10 @@
+2020-04-30  Stefan Schulze Frielinghaus  <stefansf@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.
+
 2020-04-30  Stefan Schulze Frielinghaus  <stefansf@linux.ibm.com>
 
        * toplev.c (output_stack_usage_1): Ensure that first
index 0d39326aa6378ec8bf02f8063b5733848a870783..fc861a0d8ce0e389e8680f83f12acdfb4ab80de6 100644 (file)
@@ -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;