1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[GlobalISel] Check if branches use the same MBB in matchOptBrCondByInvertingCond

If the G_BR + G_BRCOND in this combine use the same MBB, then it will infinite
loop. Don't allow that to happen.

Differential Revision: https://reviews.llvm.org/D95895
This commit is contained in:
Jessica Paquette 2021-02-02 14:21:33 -08:00
parent 0f4d0ef22a
commit 41e071e260
2 changed files with 29 additions and 4 deletions

View File

@ -968,10 +968,11 @@ bool CombinerHelper::matchOptBrCondByInvertingCond(MachineInstr &MI) {
if (BrCond->getOpcode() != TargetOpcode::G_BRCOND)
return false;
// Check that the next block is the conditional branch target.
if (!MBB->isLayoutSuccessor(BrCond->getOperand(1).getMBB()))
return false;
return true;
// Check that the next block is the conditional branch target. Also make sure
// that it isn't the same as the G_BR's target (otherwise, this will loop.)
MachineBasicBlock *BrCondTarget = BrCond->getOperand(1).getMBB();
return BrCondTarget != MI.getOperand(0).getMBB() &&
MBB->isLayoutSuccessor(BrCondTarget);
}
void CombinerHelper::applyOptBrCondByInvertingCond(MachineInstr &MI) {

View File

@ -29,6 +29,7 @@
ret i32 %retval.0
}
define void @dont_combine_same_block() { ret void }
...
---
@ -87,3 +88,26 @@ body: |
RET_ReallyLR implicit $w0
...
---
name: dont_combine_same_block
tracksRegLiveness: true
body: |
; CHECK-LABEL: name: dont_combine_same_block
; CHECK: bb.0:
; CHECK: successors: %bb.1(0x80000000)
; CHECK: liveins: $w0, $w1
; CHECK: %cond:_(s1) = G_IMPLICIT_DEF
; CHECK: G_BRCOND %cond(s1), %bb.1
; CHECK: G_BR %bb.1
; CHECK: bb.1:
; CHECK: RET_ReallyLR
bb.0:
liveins: $w0, $w1
%cond:_(s1) = G_IMPLICIT_DEF
; The G_BRCOND and G_BR have the same target here. Don't change anything.
G_BRCOND %cond(s1), %bb.1
G_BR %bb.1
bb.1:
RET_ReallyLR
...