[gcc/devel/ranger] var-tracking.c: Fix possible use of uninitialized variable pre

Aldy Hernandez aldyh@gcc.gnu.org
Wed Jun 17 20:54:17 GMT 2020


https://gcc.gnu.org/g:2786c0221b65b443217c7709cbc51e96db1b87e1

commit 2786c0221b65b443217c7709cbc51e96db1b87e1
Author: Stefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Date:   Sun Apr 26 17:10:51 2020 +0200

    var-tracking.c: Fix possible use of uninitialized variable pre
    
    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.

Diff:
---
 gcc/ChangeLog      | 7 +++++++
 gcc/var-tracking.c | 7 ++++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8abb4c0eda4..563d42cc694 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
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;


More information about the Gcc-cvs mailing list