| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 |
| ; RUN: opt -passes='function(dse),cgscc(inline),function(sroa,gvn,sccp)' -S %s | FileCheck %s |
| |
| declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) |
| |
| declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) |
| |
| declare void @llvm.assume(i1 noundef) |
| |
| declare i1 @cond() #0 |
| |
| define internal i1 @check_cond(ptr %a) #0 { |
| %l = load i32, ptr %a |
| %c = icmp eq i32 %l, 1 |
| br i1 %c, label %then, label %else |
| |
| then: |
| %res = call i1 @cond() |
| ret i1 %res |
| |
| else: |
| ret i1 0 |
| } |
| |
| define i32 @test() { |
| ; CHECK-LABEL: define i32 @test() { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[THEN_I:%.*]] |
| ; CHECK: then.i: |
| ; CHECK-NEXT: [[RES_I:%.*]] = call i1 @cond() |
| ; CHECK-NEXT: br label [[CHECK_COND_EXIT:%.*]] |
| ; CHECK: check_cond.exit: |
| ; CHECK-NEXT: call void @llvm.assume(i1 [[RES_I]]) |
| ; CHECK-NEXT: ret i32 0 |
| ; |
| entry: |
| %a = alloca i32, align 4 |
| call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %a) |
| store i32 1, ptr %a, align 4 |
| %res = call i1 @check_cond(ptr %a) |
| call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %a) |
| call void @llvm.assume(i1 %res) |
| ret i32 0 |
| } |
| |
| attributes #0 = { nounwind readonly willreturn } |