Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / speculate-call.ll
blob0d198c7e13f54de92340f82a308ecbfdaefb59fb
1 ; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s
3 ; CHECK-LABEL: @speculatable_attribute
4 ; CHECK: select
5 define i32 @speculatable_attribute(i32 %a) {
6 entry:
7   %c = icmp sgt i32 %a, 64
8   br i1 %c, label %end, label %if
10 if:
11   %val = call i32 @func() #0
12   br label %end
14 end:
15   %ret = phi i32 [%val, %if], [0, %entry]
16   ret i32 %ret
19 define i32 @func() #0 {
20   ret i32 1
23 ; We should correctly drop the attribute since it may no longer be valid
24 ; in the context the call is moved to.
25 ; Since the function is speculatable, the nonnull attribute need not be dropped
26 ; since it propagates poison (and call executes fine) if the parameter is indeed
27 ; null.
28 define i32 @strip_attr(ptr %p) {
29 ; CHECK-LABEL: strip_attr
30 ; CHECK-LABEL: entry:
31 ; CHECK:         %nullchk = icmp ne ptr %p, null
32 ; CHECK:         %val = call i32 @func_nonnull(ptr nonnull %p)
33 ; CHECK:         select
34 entry:
35   %nullchk = icmp ne ptr %p, null
36   br i1 %nullchk, label %if, label %end
38 if:
39   %val = call i32 @func_nonnull(ptr nonnull %p) #1
40   br label %end
42 end:
43   %ret = phi i32 [%val, %if], [0, %entry]
44   ret i32 %ret
47 ; We should strip the deref attribute since it can cause UB when the
48 ; speculatable call is moved.
49 define i32 @strip_attr2(ptr %p) {
50 ; CHECK-LABEL: strip_attr2
51 ; CHECK-LABEL: entry:
52 ; CHECK:         %nullchk = icmp ne ptr %p, null
53 ; CHECK:         %val = call i32 @func_nonnull(ptr %p)
54 ; CHECK:         select
55 entry:
56   %nullchk = icmp ne ptr %p, null
57   br i1 %nullchk, label %if, label %end
59 if:
60   %val = call i32 @func_nonnull(ptr dereferenceable(12) %p) #1
61   br label %end
63 end:
64   %ret = phi i32 [%val, %if], [0, %entry]
65   ret i32 %ret
68 declare i32 @func_nonnull(ptr) #1
70 attributes #0 = { nounwind readnone speculatable }
71 attributes #1 = { nounwind argmemonly speculatable }