mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
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 llvm-svn: 269760
This commit is contained in:
parent
36892682d9
commit
874333eb48
@ -3927,17 +3927,21 @@ bool X86InstrInfo::isUnpredicatedTerminator(const MachineInstr &MI) const {
|
||||
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;
|
||||
}
|
||||
|
@ -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}
|
||||
|
Loading…
x
Reference in New Issue
Block a user