[llvm-commits] [llvm] r100455 - in /llvm/trunk: lib/CodeGen/MachineSink.cpp test/CodeGen/X86/unreachable-loop-sinking.ll

Dan Gohman gohman at apple.com
Mon Apr 5 12:17:22 PDT 2010


Author: djg
Date: Mon Apr  5 14:17:22 2010
New Revision: 100455

URL: http://llvm.org/viewvc/llvm-project?rev=100455&view=rev
Log:
Don't do code sinking on unreachable blocks. It's unprofitable and hazardous.

Added:
    llvm/trunk/test/CodeGen/X86/unreachable-loop-sinking.ll
Modified:
    llvm/trunk/lib/CodeGen/MachineSink.cpp

Modified: llvm/trunk/lib/CodeGen/MachineSink.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineSink.cpp?rev=100455&r1=100454&r2=100455&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineSink.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineSink.cpp Mon Apr  5 14:17:22 2010
@@ -126,6 +126,11 @@
   // Can't sink anything out of a block that has less than two successors.
   if (MBB.succ_size() <= 1 || MBB.empty()) return false;
 
+  // Don't bother sinking code out of unreachable blocks. In addition to being
+  // unprofitable, it can also lead to infinite looping, because in an unreachable
+  // loop there may be nowhere to stop.
+  if (!DT->isReachableFromEntry(&MBB)) return false;
+
   bool MadeChange = false;
 
   // Walk the basic block bottom-up.  Remember if we saw a store.

Added: llvm/trunk/test/CodeGen/X86/unreachable-loop-sinking.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/unreachable-loop-sinking.ll?rev=100455&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/unreachable-loop-sinking.ll (added)
+++ llvm/trunk/test/CodeGen/X86/unreachable-loop-sinking.ll Mon Apr  5 14:17:22 2010
@@ -0,0 +1,30 @@
+; RUN: llc < %s
+; PR6777
+
+; MachineSink shouldn't try to sink code in unreachable blocks, as it's
+; not worthwhile, and there are corner cases which it doesn't handle.
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define double @fn1(i8* %arg, i64 %arg1) {
+Entry:
+  br i1 undef, label %Body, label %Exit
+
+Exit:                                             ; preds = %Brancher7, %Entry
+  ret double undef
+
+Body:                                             ; preds = %Entry
+  br i1 false, label %Brancher7, label %Body3
+
+Body3:                                            ; preds = %Body6, %Body3, %Body
+  br label %Body3
+
+Body6:                                            ; preds = %Brancher7
+  %tmp = fcmp oeq double 0xC04FBB2E40000000, undef ; <i1> [#uses=1]
+  br i1 %tmp, label %Body3, label %Brancher7
+
+Brancher7:                                        ; preds = %Body6, %Body
+  %tmp2 = icmp ult i32 undef, 10                  ; <i1> [#uses=1]
+  br i1 %tmp2, label %Body6, label %Exit
+}





More information about the llvm-commits mailing list