This is an alternative to D153464. BasicAA currently assumes that an unescaped alloca cannot be read through non-nocapture arguments of a call, based on the argument that if the argument were based on the alloca, it would not be unescaped. This currently fails in the case where the call is an ephemeral value and as such does not count as a capture. It also happens for calls that are readonly+nounwind+void, though that case tends to not matter in practice, because such calls will get DCEd anyway. Differential Revision: https://reviews.llvm.org/D153511
47 lines
1.2 KiB
LLVM
47 lines
1.2 KiB
LLVM
; 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 }
|