diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -2062,25 +2062,6 @@ bool Changed = false; if (HaveNonUnconditionalPredecessors) { - // It is always legal to sink common instructions from unconditional - // predecessors. However, if not all predecessors are unconditional, - // this transformation might be pessimizing. So as a rule of thumb, - // don't do it unless we'd sink at least one non-speculatable instruction. - // See https://bugs.llvm.org/show_bug.cgi?id=30244 - LRI.reset(); - unsigned Idx = 0; - bool Profitable = false; - while (Idx < ScanIdx) { - if (!isSafeToSpeculativelyExecute((*LRI)[0])) { - Profitable = true; - break; - } - --LRI; - ++Idx; - } - if (!Profitable) - return false; - LLVM_DEBUG(dbgs() << "SINK: Splitting edge\n"); // We have a conditional edge and we're going to sink some instructions. // Insert a new block postdominating all blocks we're going to sink from. diff --git a/llvm/test/CodeGen/AArch64/ifcvt-select.ll b/llvm/test/CodeGen/AArch64/ifcvt-select.ll --- a/llvm/test/CodeGen/AArch64/ifcvt-select.ll +++ b/llvm/test/CodeGen/AArch64/ifcvt-select.ll @@ -1,11 +1,29 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=arm64-apple-ios -mcpu=cyclone < %s | FileCheck %s -; Do not generate redundant select in early if-converstion pass. +; Do not generate redundant select in early if-converstion pass. define i32 @foo(i32 %a, i32 %b) { +; CHECK-LABEL: foo: +; CHECK: ; %bb.0: ; %entry +; CHECK-NEXT: sub w8, w1, w0 +; CHECK-NEXT: cmp w0, #1 ; =1 +; CHECK-NEXT: b.lt LBB0_3 +; CHECK-NEXT: ; %bb.1: ; %while.body.preheader +; CHECK-NEXT: mov w9, #1 +; CHECK-NEXT: cmp w0, w8 +; CHECK-NEXT: b.lt LBB0_3 +; CHECK-NEXT: LBB0_2: ; %while.cond +; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 +; CHECK-NEXT: add w8, w8, #5 ; =5 +; CHECK-NEXT: cmp w8, w1 +; CHECK-NEXT: cneg w10, w9, ge +; CHECK-NEXT: add w0, w0, w10 +; CHECK-NEXT: cmp w0, w8 +; CHECK-NEXT: b.ge LBB0_2 +; CHECK-NEXT: LBB0_3: ; %while.end +; CHECK-NEXT: add w0, w8, w0 +; CHECK-NEXT: ret entry: -;CHECK-LABEL: foo: -;CHECK: csinc -;CHECK-NOT: csel %sub = sub nsw i32 %b, %a %cmp10 = icmp sgt i32 %a, 0 br i1 %cmp10, label %while.body.lr.ph, label %while.end @@ -13,7 +31,7 @@ while.body.lr.ph: br label %while.body -while.body: +while.body: %j.012 = phi i32 [ %sub, %while.body.lr.ph ], [ %inc, %if.then ], [ %inc, %if.else ] %i.011 = phi i32 [ %a, %while.body.lr.ph ], [ %inc2, %if.then ], [ %dec, %if.else ] %cmp1 = icmp slt i32 %i.011, %j.012 diff --git a/llvm/test/CodeGen/Thumb2/constant-hoisting.ll b/llvm/test/CodeGen/Thumb2/constant-hoisting.ll --- a/llvm/test/CodeGen/Thumb2/constant-hoisting.ll +++ b/llvm/test/CodeGen/Thumb2/constant-hoisting.ll @@ -36,27 +36,23 @@ ; CHECK-V7M-LABEL: test_values: ; CHECK-V7M: mov r2, r0 ; CHECK-V7M-NEXT: ldr r0, .LCPI0_0 +; CHECK-V7M-NEXT: cbz r2, .LBB0_7 ; CHECK-V7M-NEXT: cmp r2, #50 ; CHECK-V7M-NEXT: beq .LBB0_5 -; CHECK-V7M-NEXT: cmp r2, #1 -; CHECK-V7M-NEXT: ittt eq -; CHECK-V7M-NEXT: addeq r0, r1 -; CHECK-V7M-NEXT: addeq r0, #1 -; CHECK-V7M-NEXT: bxeq lr -; CHECK-V7M-NEXT: .LBB0_2: ; CHECK-V7M-NEXT: cmp r2, #30 -; CHECK-V7M-NEXT: ittt eq -; CHECK-V7M-NEXT: addeq r0, r1 -; CHECK-V7M-NEXT: addeq r0, #2 -; CHECK-V7M-NEXT: bxeq lr -; CHECK-V7M-NEXT: .LBB0_3: -; CHECK-V7M-NEXT: cbnz r2, .LBB0_6 -; CHECK-V7M-NEXT: add r0, r1 -; CHECK-V7M-NEXT: bx lr +; CHECK-V7M-NEXT: beq .LBB0_6 +; CHECK-V7M-NEXT: cmp r2, #1 +; CHECK-V7M-NEXT: bne .LBB0_8 +; CHECK-V7M-NEXT: adds r0, #1 +; CHECK-V7M-NEXT: b .LBB0_7 ; CHECK-V7M-NEXT: .LBB0_5: -; CHECK-V7M-NEXT: add r0, r1 ; CHECK-V7M-NEXT: adds r0, #4 +; CHECK-V7M-NEXT: b .LBB0_7 ; CHECK-V7M-NEXT: .LBB0_6: +; CHECK-V7M-NEXT: adds r0, #2 +; CHECK-V7M-NEXT: .LBB0_7: +; CHECK-V7M-NEXT: add r0, r1 +; CHECK-V7M-NEXT: .LBB0_8: ; CHECK-V7M-NEXT: bx lr ; CHECK-V7M-NEXT: .p2align 2 ; CHECK-V7M-NEXT: .LCPI0_0: diff --git a/llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll b/llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll --- a/llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll +++ b/llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll @@ -611,17 +611,19 @@ ; CHECK-NEXT: br i1 [[FLAG:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; CHECK: if.then: ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[BLKSA:%.*]], [[NBLKS:%.*]] -; CHECK-NEXT: [[FROMBOOL1:%.*]] = zext i1 [[CMP]] to i8 -; CHECK-NEXT: br label [[IF_END:%.*]] +; CHECK-NEXT: br label [[IF_END_SINK_SPLIT:%.*]] ; CHECK: if.else: -; CHECK-NEXT: br i1 [[FLAG2:%.*]], label [[IF_THEN2:%.*]], label [[IF_END]] +; CHECK-NEXT: br i1 [[FLAG2:%.*]], label [[IF_THEN2:%.*]], label [[IF_END:%.*]] ; CHECK: if.then2: ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[NBLKS]], [[BLKSB:%.*]] ; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[ADD]], [[BLKSA]] -; CHECK-NEXT: [[FROMBOOL3:%.*]] = zext i1 [[CMP2]] to i8 +; CHECK-NEXT: br label [[IF_END_SINK_SPLIT]] +; CHECK: if.end.sink.split: +; CHECK-NEXT: [[CMP2_SINK:%.*]] = phi i1 [ [[CMP2]], [[IF_THEN2]] ], [ [[CMP]], [[IF_THEN]] ] +; CHECK-NEXT: [[FROMBOOL3:%.*]] = zext i1 [[CMP2_SINK]] to i8 ; CHECK-NEXT: br label [[IF_END]] ; CHECK: if.end: -; CHECK-NEXT: [[OBEYS_0:%.*]] = phi i8 [ [[FROMBOOL1]], [[IF_THEN]] ], [ [[FROMBOOL3]], [[IF_THEN2]] ], [ 0, [[IF_ELSE]] ] +; CHECK-NEXT: [[OBEYS_0:%.*]] = phi i8 [ 0, [[IF_ELSE]] ], [ [[FROMBOOL3]], [[IF_END_SINK_SPLIT]] ] ; CHECK-NEXT: [[TOBOOL4:%.*]] = icmp ne i8 [[OBEYS_0]], 0 ; CHECK-NEXT: ret i1 [[TOBOOL4]] ;