llvm-for-llvmta/test/Transforms/SimplifyCFG/branch-fold.ll

117 lines
3.5 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
define void @test(i32* %P, i32* %Q, i1 %A, i1 %B) {
; CHECK-LABEL: @test(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[A_NOT:%.*]] = xor i1 [[A:%.*]], true
; CHECK-NEXT: [[BRMERGE:%.*]] = or i1 [[A_NOT]], [[B:%.*]]
; CHECK-NEXT: br i1 [[BRMERGE]], label [[B:%.*]], label [[C:%.*]]
; CHECK: b:
; CHECK-NEXT: store i32 123, i32* [[P:%.*]], align 4
; CHECK-NEXT: ret void
; CHECK: c:
; CHECK-NEXT: ret void
;
entry:
br i1 %A, label %a, label %b
a:
br i1 %B, label %b, label %c
b:
store i32 123, i32* %P
ret void
c:
ret void
}
; rdar://10554090
define zeroext i1 @test2(i64 %i0, i64 %i1) nounwind uwtable readonly ssp {
; CHECK-LABEL: @test2(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[AND_I_I:%.*]] = and i64 [[I0:%.*]], 281474976710655
; CHECK-NEXT: [[AND_I11_I:%.*]] = and i64 [[I1:%.*]], 281474976710655
; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i64 [[AND_I_I]], [[AND_I11_I]]
; CHECK-NEXT: br i1 [[OR_COND]], label [[C:%.*]], label [[A:%.*]]
; CHECK: a:
; CHECK-NEXT: [[SHR_I4_I:%.*]] = lshr i64 [[I0]], 48
; CHECK-NEXT: [[AND_I5_I:%.*]] = and i64 [[SHR_I4_I]], 32767
; CHECK-NEXT: [[SHR_I_I:%.*]] = lshr i64 [[I1]], 48
; CHECK-NEXT: [[AND_I2_I:%.*]] = and i64 [[SHR_I_I]], 32767
; CHECK-NEXT: [[CMP9_I:%.*]] = icmp ult i64 [[AND_I5_I]], [[AND_I2_I]]
; CHECK-NEXT: br i1 [[CMP9_I]], label [[C]], label [[B:%.*]]
; CHECK: b:
; CHECK-NEXT: [[SHR_I13_I9:%.*]] = lshr i64 [[I1]], 48
; CHECK-NEXT: [[AND_I14_I10:%.*]] = and i64 [[SHR_I13_I9]], 32767
; CHECK-NEXT: [[SHR_I_I11:%.*]] = lshr i64 [[I0]], 48
; CHECK-NEXT: [[AND_I11_I12:%.*]] = and i64 [[SHR_I_I11]], 32767
; CHECK-NEXT: [[PHITMP:%.*]] = icmp uge i64 [[AND_I14_I10]], [[AND_I11_I12]]
; CHECK-NEXT: br label [[C]]
; CHECK: c:
; CHECK-NEXT: [[O2:%.*]] = phi i1 [ false, [[A]] ], [ [[PHITMP]], [[B]] ], [ false, [[ENTRY:%.*]] ]
; CHECK-NEXT: ret i1 [[O2]]
;
entry:
%and.i.i = and i64 %i0, 281474976710655
%and.i11.i = and i64 %i1, 281474976710655
%or.cond = icmp eq i64 %and.i.i, %and.i11.i
br i1 %or.cond, label %c, label %a
a:
%shr.i4.i = lshr i64 %i0, 48
%and.i5.i = and i64 %shr.i4.i, 32767
%shr.i.i = lshr i64 %i1, 48
%and.i2.i = and i64 %shr.i.i, 32767
%cmp9.i = icmp ult i64 %and.i5.i, %and.i2.i
br i1 %cmp9.i, label %c, label %b
b:
%shr.i13.i9 = lshr i64 %i1, 48
%and.i14.i10 = and i64 %shr.i13.i9, 32767
%shr.i.i11 = lshr i64 %i0, 48
%and.i11.i12 = and i64 %shr.i.i11, 32767
%phitmp = icmp uge i64 %and.i14.i10, %and.i11.i12
br label %c
c:
%o2 = phi i1 [ false, %a ], [ %phitmp, %b ], [ false, %entry ]
ret i1 %o2
}
; PR13180
define void @pr13180(i8 %p) {
; CHECK-LABEL: @pr13180(
; CHECK-NEXT: entry:
; CHECK-NEXT: unreachable
;
entry:
%tobool = icmp eq i8 %p, 0
br i1 %tobool, label %cond.false, label %cond.true
cond.true: ; preds = %entry
br label %cond.end
cond.false: ; preds = %entry
%phitmp = icmp eq i8 %p, 0
br label %cond.end
cond.end: ; preds = %cond.false, %cond.true
%cond = phi i1 [ undef, %cond.true ], [ %phitmp, %cond.false ]
unreachable
}
declare void @foo()
define void @test3() {
; CHECK-LABEL: @test3(
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @foo()
; CHECK-NEXT: ret void
;
entry:
br i1 0, label %bb0, label %bb0
bb0:
call void @foo()
ret void
}