diff options
author | Dan Gohman <gohman@apple.com> | 2010-04-05 19:17:22 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-04-05 19:17:22 +0000 |
commit | 918a90a3caf064e5d3f73736f8c0a38cc366d1aa (patch) | |
tree | 3878d4511211956be220783a1e937c64276a3877 | |
parent | 976d1b600220301c467059c661abbcf9052cbf07 (diff) | |
download | bcm5719-llvm-918a90a3caf064e5d3f73736f8c0a38cc366d1aa.tar.gz bcm5719-llvm-918a90a3caf064e5d3f73736f8c0a38cc366d1aa.zip |
Don't do code sinking on unreachable blocks. It's unprofitable and hazardous.
llvm-svn: 100455
-rw-r--r-- | llvm/lib/CodeGen/MachineSink.cpp | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/unreachable-loop-sinking.ll | 30 |
2 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineSink.cpp b/llvm/lib/CodeGen/MachineSink.cpp index e47ba7c2cc3..e6596190157 100644 --- a/llvm/lib/CodeGen/MachineSink.cpp +++ b/llvm/lib/CodeGen/MachineSink.cpp @@ -126,6 +126,11 @@ bool MachineSinking::ProcessBlock(MachineBasicBlock &MBB) { // 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. diff --git a/llvm/test/CodeGen/X86/unreachable-loop-sinking.ll b/llvm/test/CodeGen/X86/unreachable-loop-sinking.ll new file mode 100644 index 00000000000..35f69175a86 --- /dev/null +++ b/llvm/test/CodeGen/X86/unreachable-loop-sinking.ll @@ -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 +} |