[llvm] r269760 - Fix for PR27750. Correctly handle the case where the fallthrough block and
David L Kreitzer via llvm-commits
llvm-commits at lists.llvm.org
Tue May 17 05:47:47 PDT 2016
Author: dlkreitz
Date: Tue May 17 07:47:46 2016
New Revision: 269760
URL: http://llvm.org/viewvc/llvm-project?rev=269760&view=rev
Log:
Fix for PR27750. Correctly handle the case where the fallthrough block and
target block are the same in getFallThroughMBB.
Differential Revision: http://reviews.llvm.org/D20288
Modified:
llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
llvm/trunk/test/CodeGen/X86/fp-une-cmp.ll
Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=269760&r1=269759&r2=269760&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Tue May 17 07:47:46 2016
@@ -3927,17 +3927,21 @@ bool X86InstrInfo::isUnpredicatedTermina
return !isPredicated(MI);
}
-// Given a MBB and its TBB, find the FBB which was a fallthrough MBB (it may not
-// be a fallthorough MBB now due to layout changes). Return nullptr if the
-// fallthough MBB cannot be identified.
+// Given a MBB and its TBB, find the FBB which was a fallthrough MBB (it may
+// not be a fallthrough MBB now due to layout changes). Return nullptr if the
+// fallthrough MBB cannot be identified.
static MachineBasicBlock *getFallThroughMBB(MachineBasicBlock *MBB,
MachineBasicBlock *TBB) {
+ // Look for non-EHPad successors other than TBB. If we find exactly one, it
+ // is the fallthrough MBB. If we find zero, then TBB is both the target MBB
+ // and fallthrough MBB. If we find more than one, we cannot identify the
+ // fallthrough MBB and should return nullptr.
MachineBasicBlock *FallthroughBB = nullptr;
for (auto SI = MBB->succ_begin(), SE = MBB->succ_end(); SI != SE; ++SI) {
- if ((*SI)->isEHPad() || *SI == TBB)
+ if ((*SI)->isEHPad() || (*SI == TBB && FallthroughBB))
continue;
// Return a nullptr if we found more than one fallthrough successor.
- if (FallthroughBB)
+ if (FallthroughBB && FallthroughBB != TBB)
return nullptr;
FallthroughBB = *SI;
}
Modified: llvm/trunk/test/CodeGen/X86/fp-une-cmp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fp-une-cmp.ll?rev=269760&r1=269759&r2=269760&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/fp-une-cmp.ll (original)
+++ llvm/trunk/test/CodeGen/X86/fp-une-cmp.ll Tue May 17 07:47:46 2016
@@ -102,6 +102,34 @@ if.end:
ret void
}
+; Test that an FP oeq/une conditional branch can be inverted successfully even
+; when the true and false targets are the same (PR27750).
+;
+; CHECK-LABEL: pr27750
+; CHECK: ucomiss
+; CHECK-NEXT: jne [[TARGET:.*]]
+; CHECK-NEXT: jp [[TARGET]]
+define void @pr27750(i32* %b, float %x, i1 %y) {
+entry:
+ br label %for.cond
+
+for.cond:
+ br label %for.cond1
+
+for.cond1:
+ br i1 %y, label %for.body3.lr.ph, label %for.end
+
+for.body3.lr.ph:
+ store i32 0, i32* %b, align 4
+ br label %for.end
+
+for.end:
+; After block %for.cond gets eliminated, the two target blocks of this
+; conditional block are the same.
+ %tobool = fcmp une float %x, 0.000000e+00
+ br i1 %tobool, label %for.cond, label %for.cond1
+}
+
declare void @a()
!1 = !{!"branch_weights", i32 1, i32 1000}
More information about the llvm-commits
mailing list