mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
Reland "[SimplifyCFG] Update FoldBranchToCommonDest to be poison-safe"
This relands commit99108c791d(D95026) which was reverted by8d5a981a13because the underlying problem (https://llvm.org/pr49495) is fixed.
This commit is contained in:
@@ -186,10 +186,15 @@ bool FlattenCFG(BasicBlock *BB, AAResults *AA = nullptr);
|
||||
/// If this basic block is ONLY a setcc and a branch, and if a predecessor
|
||||
/// branches to us and one of our successors, fold the setcc into the
|
||||
/// predecessor and use logical operations to pick the right destination.
|
||||
/// If PoisonSafe is true, use select i1 rather than and/or i1 to successfully
|
||||
/// block unexpected propagation of poison when merging the branches. This is
|
||||
/// set to false by default when used by LoopSimplify for performance, but this
|
||||
/// should be turned on by default.
|
||||
bool FoldBranchToCommonDest(BranchInst *BI, llvm::DomTreeUpdater *DTU = nullptr,
|
||||
MemorySSAUpdater *MSSAU = nullptr,
|
||||
const TargetTransformInfo *TTI = nullptr,
|
||||
unsigned BonusInstThreshold = 1);
|
||||
unsigned BonusInstThreshold = 1,
|
||||
bool PoisonSafe = false);
|
||||
|
||||
/// This function takes a virtual register computed by an Instruction and
|
||||
/// replaces it with a slot in the stack frame, allocated via alloca.
|
||||
|
||||
@@ -2863,7 +2863,8 @@ CheckIfCondBranchesShareCommonDestination(BranchInst *BI, BranchInst *PBI) {
|
||||
|
||||
static bool PerformBranchToCommonDestFolding(BranchInst *BI, BranchInst *PBI,
|
||||
DomTreeUpdater *DTU,
|
||||
MemorySSAUpdater *MSSAU) {
|
||||
MemorySSAUpdater *MSSAU,
|
||||
bool PoisonSafe) {
|
||||
BasicBlock *BB = BI->getParent();
|
||||
BasicBlock *PredBlock = PBI->getParent();
|
||||
|
||||
@@ -2962,8 +2963,17 @@ static bool PerformBranchToCommonDestFolding(BranchInst *BI, BranchInst *PBI,
|
||||
|
||||
// Now that the Cond was cloned into the predecessor basic block,
|
||||
// or/and the two conditions together.
|
||||
Instruction *NewCond = cast<Instruction>(Builder.CreateBinOp(
|
||||
Opc, PBI->getCondition(), VMap[BI->getCondition()], "or.cond"));
|
||||
Value *NewCond = nullptr;
|
||||
Value *BICond = VMap[BI->getCondition()];
|
||||
bool UseBinOp = !PoisonSafe || impliesPoison(BICond, PBI->getCondition());
|
||||
|
||||
if (UseBinOp)
|
||||
NewCond = Builder.CreateBinOp(Opc, PBI->getCondition(), BICond, "or.cond");
|
||||
else
|
||||
NewCond =
|
||||
Opc == Instruction::And
|
||||
? Builder.CreateLogicalAnd(PBI->getCondition(), BICond, "or.cond")
|
||||
: Builder.CreateLogicalOr(PBI->getCondition(), BICond, "or.cond");
|
||||
PBI->setCondition(NewCond);
|
||||
|
||||
// Copy any debug value intrinsics into the end of PredBlock.
|
||||
@@ -2986,7 +2996,8 @@ static bool PerformBranchToCommonDestFolding(BranchInst *BI, BranchInst *PBI,
|
||||
bool llvm::FoldBranchToCommonDest(BranchInst *BI, DomTreeUpdater *DTU,
|
||||
MemorySSAUpdater *MSSAU,
|
||||
const TargetTransformInfo *TTI,
|
||||
unsigned BonusInstThreshold) {
|
||||
unsigned BonusInstThreshold,
|
||||
bool PoisonSafe) {
|
||||
// If this block ends with an unconditional branch,
|
||||
// let SpeculativelyExecuteBB() deal with it.
|
||||
if (!BI->isConditional())
|
||||
@@ -3077,7 +3088,7 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, DomTreeUpdater *DTU,
|
||||
continue;
|
||||
}
|
||||
|
||||
return PerformBranchToCommonDestFolding(BI, PBI, DTU, MSSAU);
|
||||
return PerformBranchToCommonDestFolding(BI, PBI, DTU, MSSAU, PoisonSafe);
|
||||
}
|
||||
return Changed;
|
||||
}
|
||||
@@ -6267,7 +6278,7 @@ bool SimplifyCFGOpt::simplifyUncondBranch(BranchInst *BI,
|
||||
// predecessor and use logical operations to update the incoming value
|
||||
// for PHI nodes in common successor.
|
||||
if (FoldBranchToCommonDest(BI, DTU, /*MSSAU=*/nullptr, &TTI,
|
||||
Options.BonusInstThreshold))
|
||||
Options.BonusInstThreshold, true))
|
||||
return requestResimplify();
|
||||
return false;
|
||||
}
|
||||
@@ -6331,7 +6342,7 @@ bool SimplifyCFGOpt::simplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) {
|
||||
// branches to us and one of our successors, fold the comparison into the
|
||||
// predecessor and use logical operations to pick the right destination.
|
||||
if (FoldBranchToCommonDest(BI, DTU, /*MSSAU=*/nullptr, &TTI,
|
||||
Options.BonusInstThreshold))
|
||||
Options.BonusInstThreshold, true))
|
||||
return requestResimplify();
|
||||
|
||||
// We have a conditional branch to two blocks that are only reachable
|
||||
|
||||
@@ -1280,7 +1280,7 @@ define i32 @test_chr_14(i32* %i, i32* %j, i32 %sum0, i1 %pred, i32 %z) !prof !14
|
||||
; CHECK-NEXT: [[V1:%.*]] = icmp ne i32 [[Z:%.*]], 1
|
||||
; CHECK-NEXT: [[V0:%.*]] = icmp eq i32 [[Z]], 0
|
||||
; CHECK-NEXT: [[V3_NONCHR:%.*]] = and i1 [[V0]], [[PRED:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[V1]], [[V3_NONCHR]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[V1]], i1 [[V3_NONCHR]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[BB0_NONCHR:%.*]], label [[BB1:%.*]], !prof !19
|
||||
; CHECK: bb0.nonchr:
|
||||
; CHECK-NEXT: call void @foo()
|
||||
|
||||
@@ -9,7 +9,7 @@ define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input) {
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[D:%.*]], 3
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[CMP]], [[CMP1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[CMP]], i1 [[CMP1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[COND_FALSE:%.*]], label [[COND_END:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -42,7 +42,7 @@ define i32 @foo_minsize(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input) #0 {
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[D:%.*]], 3
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[CMP]], [[CMP1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[CMP]], i1 [[CMP1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[COND_FALSE:%.*]], label [[COND_END:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -75,7 +75,7 @@ define i32 @foo_minsize_i64(i64 %a, i64 %b, i64 %c, i64 %d, i32* %input) #0 {
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i64 [[D:%.*]], 3
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[C:%.*]], [[A:%.*]]
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i64 [[ADD]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[CMP]], [[CMP1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[CMP]], i1 [[CMP1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[COND_FALSE:%.*]], label [[COND_END:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -108,7 +108,7 @@ define i32 @or_predicate(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input) {
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[D:%.*]], 3
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP]], [[CMP1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP1]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -141,7 +141,7 @@ define i32 @or_invert_predicate(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input) {
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[D:%.*]], 3
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP]], [[CMP1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP1]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -189,7 +189,7 @@ define i32 @or_predicate_minsize(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input) #0
|
||||
; ARM-NEXT: [[CMP:%.*]] = icmp sgt i32 [[D:%.*]], 3
|
||||
; ARM-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; ARM-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; ARM-NEXT: [[OR_COND:%.*]] = or i1 [[CMP]], [[CMP1]]
|
||||
; ARM-NEXT: [[OR_COND:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP1]]
|
||||
; ARM-NEXT: br i1 [[OR_COND]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
|
||||
; ARM: cond.false:
|
||||
; ARM-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -237,7 +237,7 @@ define i32 @or_invert_predicate_minsize(i32 %a, i32 %b, i32 %c, i32 %d, i32* %in
|
||||
; ARM-NEXT: [[CMP:%.*]] = icmp sle i32 [[D:%.*]], 3
|
||||
; ARM-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; ARM-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; ARM-NEXT: [[OR_COND:%.*]] = or i1 [[CMP]], [[CMP1]]
|
||||
; ARM-NEXT: [[OR_COND:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP1]]
|
||||
; ARM-NEXT: br i1 [[OR_COND]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
|
||||
; ARM: cond.false:
|
||||
; ARM-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -270,7 +270,7 @@ define i32 @or_xor_predicate(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input, i1 %cm
|
||||
; CHECK-NEXT: [[CMP_NOT:%.*]] = xor i1 [[CMP:%.*]], true
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP_NOT]], [[CMP1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[CMP_NOT]], i1 true, i1 [[CMP1]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -316,7 +316,7 @@ define i32 @or_xor_predicate_minsize(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input
|
||||
; ARM-NEXT: [[CMP_NOT:%.*]] = xor i1 [[CMP:%.*]], true
|
||||
; ARM-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; ARM-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; ARM-NEXT: [[OR_COND:%.*]] = or i1 [[CMP_NOT]], [[CMP1]]
|
||||
; ARM-NEXT: [[OR_COND:%.*]] = select i1 [[CMP_NOT]], i1 true, i1 [[CMP1]]
|
||||
; ARM-NEXT: br i1 [[OR_COND]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
|
||||
; ARM: cond.false:
|
||||
; ARM-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -348,7 +348,7 @@ define i32 @and_xor(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input, i1 %cmp) {
|
||||
; CHECK-NEXT: [[CMP_NOT:%.*]] = xor i1 [[CMP:%.*]], true
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[CMP_NOT]], [[CMP1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[CMP_NOT]], i1 [[CMP1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[COND_FALSE:%.*]], label [[COND_END:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
@@ -394,7 +394,7 @@ define i32 @and_xor_minsize(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input, i1 %cmp
|
||||
; ARM-NEXT: [[CMP_NOT:%.*]] = xor i1 [[CMP:%.*]], true
|
||||
; ARM-NEXT: [[ADD:%.*]] = add nsw i32 [[C:%.*]], [[A:%.*]]
|
||||
; ARM-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ADD]], [[B:%.*]]
|
||||
; ARM-NEXT: [[OR_COND:%.*]] = and i1 [[CMP_NOT]], [[CMP1]]
|
||||
; ARM-NEXT: [[OR_COND:%.*]] = select i1 [[CMP_NOT]], i1 [[CMP1]], i1 false
|
||||
; ARM-NEXT: br i1 [[OR_COND]], label [[COND_FALSE:%.*]], label [[COND_END:%.*]]
|
||||
; ARM: cond.false:
|
||||
; ARM-NEXT: [[TMP0:%.*]] = load i32, i32* [[INPUT:%.*]], align 4
|
||||
|
||||
@@ -7,7 +7,7 @@ define i32 @test_preserve_and(i8* %a, i8* %b, i8* %c, i8* %d) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8* [[A:%.*]], [[B:%.*]], !annotation !0
|
||||
; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8* [[C:%.*]], [[D:%.*]], !annotation !0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C_1]], [[C_2]], !annotation !0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C_1]], i1 [[C_2]], i1 false, !annotation !0
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[CONT1:%.*]], label [[TRAP:%.*]], !annotation !0
|
||||
; CHECK: trap: ; preds = %entry
|
||||
; CHECK-NEXT: call void @fn1()
|
||||
@@ -40,7 +40,7 @@ define i32 @test_preserve_or(i8* %a, i8* %b, i8* %c, i8* %d) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8* [[A:%.*]], [[B:%.*]], !annotation !0
|
||||
; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8* [[C:%.*]], [[D:%.*]], !annotation !0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[C_1]], [[C_2]], !annotation !0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C_1]], i1 true, i1 [[C_2]], !annotation !0
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[TRAP:%.*]], label [[CONT1:%.*]], !annotation !0
|
||||
; CHECK: trap: ; preds = %entry
|
||||
; CHECK-NEXT: call void @fn1()
|
||||
@@ -75,7 +75,7 @@ define i32 @test_preserve_or_not(i8* %a, i8* %b, i8* %c, i8* %d) {
|
||||
; CHECK-NEXT: [[C_2:%.*]] = xor i1 [[C_1]], true
|
||||
; CHECK-NEXT: [[C_2_NOT:%.*]] = xor i1 [[C_2]], true, !annotation !0
|
||||
; CHECK-NEXT: [[C_3:%.*]] = icmp uge i8* [[C:%.*]], [[D:%.*]], !annotation !0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[C_2_NOT]], [[C_3]], !annotation !0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C_2_NOT]], i1 true, i1 [[C_3]], !annotation !0
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[TRAP:%.*]], label [[CONT1:%.*]], !annotation !0
|
||||
; CHECK: trap: ; preds = %entry
|
||||
; CHECK-NEXT: call void @fn1()
|
||||
@@ -112,7 +112,7 @@ define i32 @test_or_not_no_annotation(i8* %a, i8* %b, i8* %c, i8* %d) {
|
||||
; CHECK-NEXT: [[C_2:%.*]] = xor i1 [[C_1]], true
|
||||
; CHECK-NEXT: [[C_2_NOT:%.*]] = xor i1 [[C_2]], true
|
||||
; CHECK-NEXT: [[C_3:%.*]] = icmp uge i8* [[C:%.*]], [[D:%.*]], !annotation !0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[C_2_NOT]], [[C_3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C_2_NOT]], i1 true, i1 [[C_3]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[TRAP:%.*]], label [[CONT1:%.*]], !annotation !0
|
||||
; CHECK: trap: ; preds = %entry
|
||||
; CHECK-NEXT: call void @fn1()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
;CHECK: icmp eq i32
|
||||
;CHECK: and i32 %c2, %k
|
||||
;CHECK: icmp eq i32
|
||||
;CHECK: or i1
|
||||
;CHECK: select i1 {{.*}}, i1 true,
|
||||
;CHECK: ret
|
||||
define i32 @foo(i32 %k, i32 %c1, i32 %c2) {
|
||||
%1 = and i32 %c1, %k
|
||||
|
||||
@@ -14,7 +14,7 @@ define void @one_pred(i8 %v0, i8 %v1) {
|
||||
; CHECK-NEXT: pred:
|
||||
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C0]], [[C1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -45,12 +45,12 @@ define void @two_preds(i8 %v0, i8 %v1, i8 %v2, i8 %v3) {
|
||||
; CHECK: pred0:
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
|
||||
; CHECK-NEXT: [[C3_OLD:%.*]] = icmp eq i8 [[V3:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND1:%.*]] = or i1 [[C1]], [[C3_OLD]]
|
||||
; CHECK-NEXT: [[OR_COND1:%.*]] = select i1 [[C1]], i1 true, i1 [[C3_OLD]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: pred1:
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C2]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT]], label [[FINAL_RIGHT]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -87,7 +87,7 @@ define void @one_pred_with_extra_op(i8 %v0, i8 %v1) {
|
||||
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
|
||||
; CHECK-NEXT: [[V1_ADJ:%.*]] = add i8 [[V0]], [[V1:%.*]]
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C0]], [[C1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -120,13 +120,13 @@ define void @two_preds_with_extra_op(i8 %v0, i8 %v1, i8 %v2, i8 %v3) {
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
|
||||
; CHECK-NEXT: [[V3_ADJ_OLD:%.*]] = add i8 [[V1]], [[V2:%.*]]
|
||||
; CHECK-NEXT: [[C3_OLD:%.*]] = icmp eq i8 [[V3_ADJ_OLD]], 0
|
||||
; CHECK-NEXT: [[OR_COND1:%.*]] = or i1 [[C1]], [[C3_OLD]]
|
||||
; CHECK-NEXT: [[OR_COND1:%.*]] = select i1 [[C1]], i1 true, i1 [[C3_OLD]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: pred1:
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2]], 0
|
||||
; CHECK-NEXT: [[V3_ADJ:%.*]] = add i8 [[V1]], [[V2]]
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C2]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT]], label [[FINAL_RIGHT]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -165,7 +165,7 @@ define void @one_pred_with_extra_op_multiuse(i8 %v0, i8 %v1) {
|
||||
; CHECK-NEXT: [[V1_ADJ:%.*]] = add i8 [[V0]], [[V1:%.*]]
|
||||
; CHECK-NEXT: [[V1_ADJ_ADJ:%.*]] = add i8 [[V1_ADJ]], [[V1_ADJ]]
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1_ADJ_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C0]], [[C1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -200,14 +200,14 @@ define void @two_preds_with_extra_op_multiuse(i8 %v0, i8 %v1, i8 %v2, i8 %v3) {
|
||||
; CHECK-NEXT: [[V3_ADJ_OLD:%.*]] = add i8 [[V1]], [[V2:%.*]]
|
||||
; CHECK-NEXT: [[V3_ADJ_ADJ_OLD:%.*]] = add i8 [[V3_ADJ_OLD]], [[V3_ADJ_OLD]]
|
||||
; CHECK-NEXT: [[C3_OLD:%.*]] = icmp eq i8 [[V3_ADJ_ADJ_OLD]], 0
|
||||
; CHECK-NEXT: [[OR_COND1:%.*]] = or i1 [[C1]], [[C3_OLD]]
|
||||
; CHECK-NEXT: [[OR_COND1:%.*]] = select i1 [[C1]], i1 true, i1 [[C3_OLD]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: pred1:
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2]], 0
|
||||
; CHECK-NEXT: [[V3_ADJ:%.*]] = add i8 [[V1]], [[V2]]
|
||||
; CHECK-NEXT: [[V3_ADJ_ADJ:%.*]] = add i8 [[V3_ADJ]], [[V3_ADJ]]
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3_ADJ_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C2]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT]], label [[FINAL_RIGHT]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -247,7 +247,7 @@ define void @one_pred_with_extra_op_liveout(i8 %v0, i8 %v1) {
|
||||
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
|
||||
; CHECK-NEXT: [[V1_ADJ:%.*]] = add i8 [[V0]], [[V1:%.*]]
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C0]], [[C1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -278,7 +278,7 @@ define void @one_pred_with_extra_op_liveout_multiuse(i8 %v0, i8 %v1) {
|
||||
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
|
||||
; CHECK-NEXT: [[V1_ADJ:%.*]] = add i8 [[V0]], [[V1:%.*]]
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C0]], [[C1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -315,7 +315,7 @@ define void @one_pred_with_extra_op_liveout_distant_phi(i8 %v0, i8 %v1) {
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
|
||||
; CHECK-NEXT: [[V2_ADJ:%.*]] = add i8 [[V0]], [[V1]]
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C1]], [[C2]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -366,7 +366,7 @@ define void @two_preds_with_extra_op_liveout(i8 %v0, i8 %v1, i8 %v2, i8 %v3) {
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
|
||||
; CHECK-NEXT: [[V3_ADJ:%.*]] = add i8 [[V1]], [[V2]]
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C2]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: dispatch:
|
||||
; CHECK-NEXT: [[V3_ADJ_OLD:%.*]] = add i8 [[V1]], [[V2]]
|
||||
@@ -416,7 +416,7 @@ define void @two_preds_with_extra_op_liveout_multiuse(i8 %v0, i8 %v1, i8 %v2, i8
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
|
||||
; CHECK-NEXT: [[V3_ADJ:%.*]] = add i8 [[V1]], [[V2]]
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3_ADJ]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C2]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: dispatch:
|
||||
; CHECK-NEXT: [[V3_ADJ_OLD:%.*]] = add i8 [[V1]], [[V2]]
|
||||
@@ -467,7 +467,7 @@ define void @one_pred_with_extra_op_eexternally_used_only(i8 %v0, i8 %v1) {
|
||||
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
|
||||
; CHECK-NEXT: [[V1_ADJ:%.*]] = add i8 [[V0]], [[V1:%.*]]
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C0]], [[C1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -498,7 +498,7 @@ define void @one_pred_with_extra_op_externally_used_only_multiuse(i8 %v0, i8 %v1
|
||||
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
|
||||
; CHECK-NEXT: [[V1_ADJ:%.*]] = add i8 [[V0]], [[V1:%.*]]
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C0]], [[C1]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -538,7 +538,7 @@ define void @two_preds_with_extra_op_externally_used_only(i8 %v0, i8 %v1, i8 %v2
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
|
||||
; CHECK-NEXT: [[V3_ADJ:%.*]] = add i8 [[V1]], [[V2]]
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C2]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: dispatch:
|
||||
; CHECK-NEXT: [[V3_ADJ_OLD:%.*]] = add i8 [[V1]], [[V2]]
|
||||
@@ -588,7 +588,7 @@ define void @two_preds_with_extra_op_externally_used_only_multiuse(i8 %v0, i8 %v
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
|
||||
; CHECK-NEXT: [[V3_ADJ:%.*]] = add i8 [[V1]], [[V2]]
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C2]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: dispatch:
|
||||
; CHECK-NEXT: [[V3_ADJ_OLD:%.*]] = add i8 [[V1]], [[V2]]
|
||||
@@ -640,7 +640,7 @@ define void @one_pred_with_extra_op_externally_used_only_after_cond_distant_phi(
|
||||
; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3:%.*]], 0
|
||||
; CHECK-NEXT: [[V2_ADJ:%.*]] = add i8 [[V4:%.*]], [[V5:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C1]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C1]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: final_left:
|
||||
; CHECK-NEXT: call void @sideeffect0()
|
||||
@@ -690,7 +690,7 @@ define void @two_preds_with_extra_op_externally_used_only_after_cond(i8 %v0, i8
|
||||
; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
|
||||
; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[V3:%.*]], 0
|
||||
; CHECK-NEXT: [[V3_ADJ:%.*]] = add i8 [[V4:%.*]], [[V5:%.*]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C2]], [[C3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2]], i1 [[C3]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT]], label [[FINAL_RIGHT:%.*]]
|
||||
; CHECK: dispatch:
|
||||
; CHECK-NEXT: [[C3_OLD:%.*]] = icmp eq i8 [[V3]], 0
|
||||
@@ -745,7 +745,7 @@ define void @pr48450() {
|
||||
; CHECK-NEXT: [[C2_NOT:%.*]] = xor i1 [[C2]], true
|
||||
; CHECK-NEXT: [[DEC:%.*]] = add i8 [[COUNTDOWN]], -1
|
||||
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[COUNTDOWN]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[C2_NOT]], [[CMP_NOT]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2_NOT]], i1 true, i1 [[CMP_NOT]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_END_LOOPEXIT]], label [[FOR_BODYTHREAD_PRE_SPLIT]]
|
||||
; CHECK: for.bodythread-pre-split:
|
||||
; CHECK-NEXT: [[DEC_MERGE]] = phi i8 [ [[DEC]], [[IF_THEN]] ], [ [[DEC_OLD]], [[FOR_INC]] ]
|
||||
@@ -796,7 +796,7 @@ define void @pr48450_2(i1 %enable_loopback) {
|
||||
; CHECK-NEXT: [[C2_NOT:%.*]] = xor i1 [[C2]], true
|
||||
; CHECK-NEXT: [[DEC:%.*]] = add i8 [[COUNTDOWN]], -1
|
||||
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[COUNTDOWN]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[C2_NOT]], [[CMP_NOT]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C2_NOT]], i1 true, i1 [[CMP_NOT]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_END_LOOPEXIT]], label [[FOR_BODYTHREAD_PRE_SPLIT]]
|
||||
; CHECK: for.bodythread-pre-split:
|
||||
; CHECK-NEXT: [[DEC_MERGE]] = phi i8 [ [[DEC_OLD]], [[FOR_INC]] ], [ [[DEC_MERGE]], [[FOR_BODYTHREAD_PRE_SPLIT_LOOPBACK:%.*]] ], [ [[DEC]], [[IF_THEN]] ]
|
||||
|
||||
@@ -33,7 +33,7 @@ define void @dbg_all_equal(i32 %k, i32 %c1, i32 %c2) !dbg !17 {
|
||||
; CHECK-NEXT: [[C1:%[a-z0-9]+]] = icmp eq i32 [[A1]], 0, !dbg [[DBG]]
|
||||
; CHECK-NEXT: [[A2:%[a-z0-9]+]] = and i32 %c2, %k, !dbg [[DBG]]
|
||||
; CHECK-NEXT: [[C2:%[a-z0-9]+]] = icmp eq i32 [[A2]], 0, !dbg [[DBG]]
|
||||
; CHECK-NEXT: [[OR:%[.a-z0-9]+]] = or i1 [[C1]], [[C2]], !dbg [[DBG]]
|
||||
; CHECK-NEXT: [[OR:%[.a-z0-9]+]] = select i1 [[C1]], i1 true, i1 [[C2]], !dbg [[DBG]]
|
||||
; CHECK-NEXT: br i1 [[OR]], label {{.+}}, label {{.+}}, !dbg [[DBG]]
|
||||
;
|
||||
%1 = and i32 %c1, %k, !dbg !18
|
||||
|
||||
@@ -8,7 +8,7 @@ define void @test1(i1 %a, i1 %b) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[A_NOT:%.*]] = xor i1 [[A:%.*]], true
|
||||
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A_NOT]], [[C]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A_NOT]], i1 [[C]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !0
|
||||
; CHECK: Y:
|
||||
; CHECK-NEXT: call void @helper(i32 0)
|
||||
@@ -40,7 +40,7 @@ define void @fake_weights(i1 %a, i1 %b) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[A_NOT:%.*]] = xor i1 [[A:%.*]], true
|
||||
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A_NOT]], [[C]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A_NOT]], i1 [[C]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !1
|
||||
; CHECK: Y:
|
||||
; CHECK-NEXT: call void @helper(i32 0)
|
||||
@@ -68,7 +68,7 @@ define void @test2(i1 %a, i1 %b) {
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A:%.*]], [[C]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A:%.*]], i1 [[C]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !2
|
||||
; CHECK: Y:
|
||||
; CHECK-NEXT: call void @helper(i32 0)
|
||||
@@ -97,7 +97,7 @@ define void @test3(i1 %a, i1 %b) {
|
||||
; CHECK-LABEL: @test3(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A:%.*]], [[C]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A:%.*]], i1 [[C]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !1
|
||||
; CHECK: Y:
|
||||
; CHECK-NEXT: call void @helper(i32 0)
|
||||
@@ -126,7 +126,7 @@ define void @test4(i1 %a, i1 %b) {
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[A:%.*]], [[C]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A:%.*]], i1 [[C]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof !1
|
||||
; CHECK: Y:
|
||||
; CHECK-NEXT: call void @helper(i32 0)
|
||||
@@ -257,7 +257,7 @@ define void @test1_swap(i1 %a, i1 %b) {
|
||||
; CHECK-LABEL: @test1_swap(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[A:%.*]], [[C]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[C]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[Y:%.*]], label [[Z:%.*]], !prof !5
|
||||
; CHECK: Y:
|
||||
; CHECK-NEXT: call void @helper(i32 0)
|
||||
@@ -507,7 +507,7 @@ define void @test14(i32* %old, i32 %final) {
|
||||
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[BIT_0]], 0
|
||||
; CHECK-NEXT: [[V3:%.*]] = load i32, i32* @max_regno, align 4
|
||||
; CHECK-NEXT: [[CMP4:%.*]] = icmp eq i32 [[I_1]], [[V3]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[TOBOOL]], [[CMP4]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TOBOOL]], i1 true, i1 [[CMP4]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FOR_EXIT:%.*]], label [[FOR_INC]], !prof !11
|
||||
; CHECK: for.inc:
|
||||
; CHECK-NEXT: [[SHL]] = shl i32 [[BIT_0]], 1
|
||||
@@ -644,7 +644,7 @@ define void @or_icmps_harmful(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[EXPECTED_TRUE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof !19
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -676,7 +676,7 @@ define void @or_icmps_harmful_inverted(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sle i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[EXPECTED_FALSE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 true, i1 [[EXPENSIVE]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof !19
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -707,7 +707,7 @@ define void @or_icmps_not_that_harmful(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[EXPECTED_TRUE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof !20
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -736,7 +736,7 @@ define void @or_icmps_not_that_harmful_inverted(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[EXPECTED_TRUE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof !21
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -765,7 +765,7 @@ define void @or_icmps_useful(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[EXPECTED_TRUE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof !22
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -794,7 +794,7 @@ define void @or_icmps_useful_inverted(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[EXPECTED_FALSE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 true, i1 [[EXPENSIVE]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof !22
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -825,7 +825,7 @@ define void @or_icmps_empty_metadata(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[EXPECTED_TRUE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[MORE_RARE:%.*]]
|
||||
; CHECK: more_rare:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -857,7 +857,7 @@ define void @and_icmps_harmful(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[EXPECTED_FALSE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof !23
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -889,7 +889,7 @@ define void @and_icmps_harmful_inverted(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[EXPECTED_TRUE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof !23
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -918,7 +918,7 @@ define void @and_icmps_not_that_harmful(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[EXPECTED_FALSE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof !24
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -947,7 +947,7 @@ define void @and_icmps_not_that_harmful_inverted(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[EXPECTED_TRUE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof !24
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -976,7 +976,7 @@ define void @and_icmps_useful(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[EXPECTED_TRUE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof !25
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
@@ -1005,7 +1005,7 @@ define void @and_icmps_useful_inverted(i32 %x, i32 %y, i8* %p) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sle i32 [[X:%.*]], -1
|
||||
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[EXPECTED_FALSE]], [[EXPENSIVE]]
|
||||
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
|
||||
; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof !25
|
||||
; CHECK: false:
|
||||
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
|
||||
|
||||
@@ -465,8 +465,8 @@ return: ; preds = %if.end, %if.then
|
||||
define void @test12() nounwind {
|
||||
; CHECK-LABEL: @test12(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[DOTOLD:%.*]] = icmp eq i32 undef, undef
|
||||
; CHECK-NEXT: br i1 [[DOTOLD]], label [[BB55_US_US:%.*]], label [[MALFORMED:%.*]]
|
||||
; CHECK-NEXT: [[A_OLD:%.*]] = icmp eq i32 undef, undef
|
||||
; CHECK-NEXT: br i1 [[A_OLD]], label [[BB55_US_US:%.*]], label [[MALFORMED:%.*]]
|
||||
; CHECK: bb55.us.us:
|
||||
; CHECK-NEXT: [[B:%.*]] = icmp ugt i32 undef, undef
|
||||
; CHECK-NEXT: [[A:%.*]] = icmp eq i32 undef, undef
|
||||
|
||||
Reference in New Issue
Block a user