re PR target/79430 (action of statement incorrectly optimised away)
authorJakub Jelinek <jakub@redhat.com>
Mon, 1 May 2017 09:50:59 +0000 (11:50 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 1 May 2017 09:50:59 +0000 (11:50 +0200)
PR target/79430
* rtlanal.c (reg_set_p): If reg is a stack_pointer_rtx, also
check for stack push/pop autoinc.
* config/i386/i386.c (ix86_agi_dependent): Return false
if the only reason why modified_in_p returned true is that
addr is SP based and set_insn is a push or pop.

From-SVN: r247429

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/rtlanal.c

index f8bde7a91e47c942a2b5fa995e93118fb87d624c..52c6a4eb4fa43b2c60af6567387f176aa097d7f8 100644 (file)
@@ -1,3 +1,12 @@
+2017-05-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/79430
+       * rtlanal.c (reg_set_p): If reg is a stack_pointer_rtx, also
+       check for stack push/pop autoinc.
+       * config/i386/i386.c (ix86_agi_dependent): Return false
+       if the only reason why modified_in_p returned true is that
+       addr is SP based and set_insn is a push or pop.
+
 2017-04-29  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/79224
index d9856573db7b5041acf0f4fe89b5c6265cb5e9e4..a09c2c7da2184d5c03319457f2eaf7e729b2b0a6 100644 (file)
@@ -29243,7 +29243,26 @@ ix86_agi_dependent (rtx_insn *set_insn, rtx_insn *use_insn)
     if (MEM_P (recog_data.operand[i]))
       {
        rtx addr = XEXP (recog_data.operand[i], 0);
-       return modified_in_p (addr, set_insn) != 0;
+       if (modified_in_p (addr, set_insn) != 0)
+         {
+           /* No AGI stall if SET_INSN is a push or pop and USE_INSN
+              has SP based memory (unless index reg is modified in a pop).  */
+           rtx set = single_set (set_insn);
+           if (set
+               && (push_operand (SET_DEST (set), GET_MODE (SET_DEST (set)))
+                   || pop_operand (SET_SRC (set), GET_MODE (SET_SRC (set)))))
+             {
+               struct ix86_address parts;
+               if (ix86_decompose_address (addr, &parts)
+                   && parts.base == stack_pointer_rtx
+                   && (parts.index == NULL_RTX
+                       || MEM_P (SET_DEST (set))
+                       || !modified_in_p (parts.index, set_insn)))
+                 return false;
+             }
+           return true;
+         }
+       return false;
       }
   return false;
 }
index acb4230aac83eb9dd0e608349e51197dae66539c..321363f9746014c175506a8ed5cf1ae5b710f38d 100644 (file)
@@ -1221,6 +1221,24 @@ reg_set_p (const_rtx reg, const_rtx insn)
                  || find_reg_fusage (insn, CLOBBER, reg)))))
     return true;
 
+  /* There are no REG_INC notes for SP autoinc.  */
+  if (reg == stack_pointer_rtx && INSN_P (insn))
+    {
+      subrtx_var_iterator::array_type array;
+      FOR_EACH_SUBRTX_VAR (iter, array, PATTERN (insn), NONCONST)
+       {
+         rtx mem = *iter;
+         if (mem
+             && MEM_P (mem)
+             && GET_RTX_CLASS (GET_CODE (XEXP (mem, 0))) == RTX_AUTOINC)
+           {
+             if (XEXP (XEXP (mem, 0), 0) == stack_pointer_rtx)
+               return true;
+             iter.skip_subrtxes ();
+           }
+       }
+    }
+
   return set_of (reg, insn) != NULL_RTX;
 }