1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

[IfConversion] Disallow TrueBB == FalseBB for valid diamonds

Summary:
This fixes PR45302.

Previously the case

     BB1
     / \
    |   |
   TBB FBB
    |   |
     \ /
     BB2

was treated as a valid diamond also when TBB and FBB was the same basic
block. This then lead to a failed assertion in IfConvertDiamond.

Since TBB == FBB is quite a degenerated case of a diamond, we now
don't treat it as a valid diamond anymore, and thus we will avoid the
trouble of making IfConvertDiamond handle it correctly.

Reviewers: efriedma, kparzysz

Reviewed By: efriedma

Subscribers: hiraditya, llvm-commits

Differential Revision: https://reviews.llvm.org/D77651
This commit is contained in:
Mikael Holmen 2020-04-08 11:58:26 +02:00
parent 5cfdb4f2d2
commit d075e066f3
2 changed files with 45 additions and 0 deletions

View File

@ -972,6 +972,11 @@ bool IfConverter::ValidDiamond(
FalseBBI.IsBeingAnalyzed || FalseBBI.IsDone)
return false;
// If the True and False BBs are equal we're dealing with a degenerate case
// that we don't treat as a diamond.
if (TrueBBI.BB == FalseBBI.BB)
return false;
MachineBasicBlock *TT = TrueBBI.TrueBB;
MachineBasicBlock *FT = FalseBBI.TrueBB;

View File

@ -0,0 +1,40 @@
# RUN: llc -mtriple=thumbv7-apple-ios -o - %s -run-pass if-converter -verify-machineinstrs | FileCheck %s
# Don't treat bb.1 as a valid diamond since IfConverter::IfConvertDiamond can't
# handle it and used to hit an assertion instead.
--- |
define void @func() minsize {
ret void
}
...
---
name: func
body: |
bb.0:
tBcc %bb.3, 1, $cpsr
bb.1:
tBcc %bb.2, 1, $cpsr
tB %bb.2, 14, $noreg
bb.2:
bb.3:
successors:
tBX_RET 14, _
...
# CHECK-LABEL: bb.0:
# CHECK: tBcc %bb.3, 1
# CHECK-LABEL: bb.1:
# CHECK: tBcc %bb.2, 1
# CHECK-NEXT: tB %bb.2, 14
# CHECK-LABEL: bb.2:
# CHECK-LABEL: bb.3:
# CHECK: tBX_RET 14