1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00
llvm-mirror/test/Feature/OperandBundles/dse.ll
Sanjoy Das 99ca015392 [OperandBundles] Treat "deopt" operand bundles specially
Teach LLVM optimize to more precisely in the presence of "deopt" operand
bundles.  "deopt" operand bundles imply that the call they're attached
to is at least `readonly` (i.e. they don't imply clobber semantics), and
they don't capture their bundle operands.

llvm-svn: 254118
2015-11-26 01:16:05 +00:00

63 lines
1.6 KiB
LLVM

; RUN: opt -S -dse < %s | FileCheck %s
declare void @f()
declare noalias i8* @malloc(i32) nounwind
define void @test_0() {
; CHECK-LABEL: @test_0(
%m = call i8* @malloc(i32 24)
tail call void @f() [ "unknown"(i8* %m) ]
; CHECK: store i8 -19, i8* %m
store i8 -19, i8* %m
ret void
}
define i8* @test_1() {
; CHECK-LABEL: @test_1(
%m = call i8* @malloc(i32 24)
tail call void @f() [ "unknown"(i8* %m) ]
store i8 -19, i8* %m
tail call void @f()
store i8 101, i8* %m
; CHECK: tail call void @f() [ "unknown"(i8* %m) ]
; CHECK: store i8 -19, i8* %m
; CHECK: tail call void @f()
; CHECK: store i8 101, i8* %m
ret i8* %m
}
define void @test_2() {
; Since the deopt operand bundle does not escape %m (see caveat below), it is
; legal to elide the final store that location.
; CHECK-LABEL: @test_2(
%m = call i8* @malloc(i32 24)
tail call void @f() [ "deopt"(i8* %m) ]
store i8 -19, i8* %m
ret void
; CHECK: tail call void @f() [ "deopt"(i8* %m) ]
; CHECK-NEXT ret void
}
define i8* @test_3() {
; Since the deopt operand bundle does not escape %m (see caveat below), @f
; cannot observe the stores to %m
; CHECK-LABEL: @test_3(
%m = call i8* @malloc(i32 24)
tail call void @f() [ "deopt"(i8* %m) ]
store i8 -19, i8* %m
tail call void @f()
store i8 101, i8* %m
ret i8* %m
}
; Caveat: technically, %m can only escape if the calling function is deoptimized
; at the call site (i.e. the call returns to the "deopt" continuation). Since
; the calling function body will be invalidated in that case, the calling
; function can be optimized under the assumption that %m does not escape.