[PATCH] D15847: [ShrinkWrap] Fix FindIDom to only have one kind of failure

Michael Kuperstein via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 3 02:15:43 PST 2016


mkuper created this revision.
mkuper added reviewers: qcolombet, kbarton.
mkuper added a subscriber: llvm-commits.

FindIDom could fail in two different ways - it could return either nullptr or the block itself, depending on the circumstances.
Some users checked one error condition, while others checked the other.

Make it always return nullptr on failure.
This fixes PR26004.

http://reviews.llvm.org/D15847

Files:
  lib/CodeGen/ShrinkWrap.cpp
  test/CodeGen/X86/shrinkwrap-hang.ll

Index: lib/CodeGen/ShrinkWrap.cpp
===================================================================
--- lib/CodeGen/ShrinkWrap.cpp
+++ lib/CodeGen/ShrinkWrap.cpp
@@ -263,6 +263,8 @@
     if (!IDom)
       break;
   }
+  if (IDom == &Block)
+    return nullptr;
   return IDom;
 }
 
@@ -352,13 +354,9 @@
       if (MLI->getLoopDepth(Save) > MLI->getLoopDepth(Restore)) {
         // Push Save outside of this loop if immediate dominator is different
         // from save block. If immediate dominator is not different, bail out.
-        MachineBasicBlock *IDom = FindIDom<>(*Save, Save->predecessors(), *MDT);
-        if (IDom != Save)
-          Save = IDom;
-        else {
-          Save = nullptr;
+        Save = FindIDom<>(*Save, Save->predecessors(), *MDT);
+        if (!Save)
           break;
-        }
       } else {
         // If the loop does not exit, there is no point in looking
         // for a post-dominator outside the loop.
Index: test/CodeGen/X86/shrinkwrap-hang.ll
===================================================================
--- test/CodeGen/X86/shrinkwrap-hang.ll
+++ test/CodeGen/X86/shrinkwrap-hang.ll
@@ -0,0 +1,32 @@
+; RUN: llc %s -o - -enable-shrink-wrap=true | FileCheck %s
+
+target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
+target triple = "i686-pc-linux"
+
+ at b = global i32 1, align 4
+ at a = common global i32 0, align 4
+
+declare void @fn1() #0
+
+; CHECK-LABEL: fn2:
+define void @fn2() #0 {
+entry:
+  %0 = load i32, i32* @b, align 4
+  %tobool = icmp eq i32 %0, 0
+  br i1 %tobool, label %if.end, label %lbl
+
+lbl:                                              ; preds = %if.end, %entry
+  store i32 0, i32* @b, align 4
+  br label %if.end
+
+if.end:                                           ; preds = %entry, %lbl
+  tail call void @fn1()
+  %1 = load i32, i32* @b, align 4
+  %tobool1 = icmp eq i32 %1, 0
+  br i1 %tobool1, label %if.end3, label %lbl
+
+if.end3:                                          ; preds = %if.end
+  ret void
+}
+
+attributes #0 = { norecurse nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15847.43855.patch
Type: text/x-patch
Size: 2403 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160103/1b844440/attachment.bin>


More information about the llvm-commits mailing list