Files
clang-p2996/llvm/test/Transforms/PhaseOrdering/dse-ephemeral-value-captures.ll
Nikita Popov c0de28b92e [BasicAA] Don't short-circuit non-capturing arguments
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
2023-06-26 12:27:32 +02:00

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 }