]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/87852 (FAIL: gcc.c-torture/execute/pr53465.c)
authorRichard Biener <rguenther@suse.de>
Mon, 5 Nov 2018 08:04:49 +0000 (08:04 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 5 Nov 2018 08:04:49 +0000 (08:04 +0000)
2018-11-05  Richard Biener  <rguenther@suse.de>

PR rtl-optimization/87852
* fwprop.c (use_killed_between): Only consider single-defs of the
use whose definition statement dominates the use.

From-SVN: r265791

gcc/ChangeLog
gcc/fwprop.c

index 80c897a916449976dfd276ef8ec2483e06cd503e..b3a25674cee11fb9bf56ddf2e13159e759f34939 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-05  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/87852
+       * fwprop.c (use_killed_between): Only consider single-defs of the
+       use whose definition statement dominates the use.
+
 2018-11-05  Martin Liska  <mliska@suse.cz>
 
        PR web/87829
index 0fca0f1edbc24104c27bf20f8e641307d921f16d..78c08e0a9dfaf895a31fea41cbad1b046bb86a3f 100644 (file)
@@ -731,14 +731,15 @@ local_ref_killed_between_p (df_ref ref, rtx_insn *from, rtx_insn *to)
 }
 
 
-/* Check if the given DEF is available in INSN.  This would require full
-   computation of available expressions; we check only restricted conditions:
-   - if DEF is the sole definition of its register, go ahead;
-   - in the same basic block, we check for no definitions killing the
-     definition of DEF_INSN;
-   - if USE's basic block has DEF's basic block as the sole predecessor,
-     we check if the definition is killed after DEF_INSN or before
+/* Check if USE is killed between DEF_INSN and TARGET_INSN.  This would
+   require full computation of available expressions; we check only a few
+   restricted conditions:
+   - if the reg in USE has only one definition, go ahead;
+   - in the same basic block, we check for no definitions killing the use;
+   - if TARGET_INSN's basic block has DEF_INSN's basic block as its sole
+     predecessor, we check if the use is killed after DEF_INSN or before
      TARGET_INSN insn, in their respective basic blocks.  */
+
 static bool
 use_killed_between (df_ref use, rtx_insn *def_insn, rtx_insn *target_insn)
 {
@@ -762,12 +763,17 @@ use_killed_between (df_ref use, rtx_insn *def_insn, rtx_insn *target_insn)
      know that this definition reaches use, or we wouldn't be here.
      However, this is invalid for hard registers because if they are
      live at the beginning of the function it does not mean that we
-     have an uninitialized access.  */
+     have an uninitialized access.  And we have to check for the case
+     where a register may be used uninitialized in a loop as above.  */
   regno = DF_REF_REGNO (use);
   def = DF_REG_DEF_CHAIN (regno);
   if (def
       && DF_REF_NEXT_REG (def) == NULL
-      && regno >= FIRST_PSEUDO_REGISTER)
+      && regno >= FIRST_PSEUDO_REGISTER
+      && (BLOCK_FOR_INSN (DF_REF_INSN (def)) == def_bb
+         ? DF_INSN_LUID (DF_REF_INSN (def)) < DF_INSN_LUID (def_insn)
+         : dominated_by_p (CDI_DOMINATORS,
+                           def_bb, BLOCK_FOR_INSN (DF_REF_INSN (def)))))
     return false;
 
   /* Check locally if we are in the same basic block.  */