@@ -25,8 +25,58 @@ entry:
25
25
ret ptr %load
26
26
}
27
27
28
- define ptr @turn_nonnull_into_assume (ptr %arg ) {
29
- ; CHECK-LABEL: @turn_nonnull_into_assume(
28
+ define i32 @propagate_range (i32 %v ) {
29
+ ; CHECK-LABEL: @propagate_range(
30
+ ; CHECK-NEXT: entry:
31
+ ; CHECK-NEXT: [[A_SROA_1:%.*]] = alloca i32, align 4
32
+ ; CHECK-NEXT: store i32 [[V:%.*]], ptr [[A_SROA_1]], align 4
33
+ ; CHECK-NEXT: [[A_SROA_1_0_A_SROA_1_4_LOAD:%.*]] = load volatile i32, ptr [[A_SROA_1]], align 4
34
+ ; CHECK-NEXT: ret i32 [[A_SROA_1_0_A_SROA_1_4_LOAD]]
35
+ ;
36
+ entry:
37
+ %a = alloca [2 x i32 ]
38
+ %a.gep1 = getelementptr [2 x i32 ], ptr %a , i32 0 , i32 1
39
+ store i32 %v , ptr %a.gep1
40
+ store i32 0 , ptr %a
41
+ %load = load volatile i32 , ptr %a.gep1 , !range !{i32 0 , i32 10 }
42
+ ret i32 %load
43
+ }
44
+
45
+ define ptr @propagate_noundef (ptr %v ) {
46
+ ; CHECK-LABEL: @propagate_noundef(
47
+ ; CHECK-NEXT: entry:
48
+ ; CHECK-NEXT: [[A_SROA_1:%.*]] = alloca ptr, align 8
49
+ ; CHECK-NEXT: store ptr [[V:%.*]], ptr [[A_SROA_1]], align 8
50
+ ; CHECK-NEXT: [[A_SROA_1_0_A_SROA_1_8_LOAD:%.*]] = load volatile ptr, ptr [[A_SROA_1]], align 8
51
+ ; CHECK-NEXT: ret ptr [[A_SROA_1_0_A_SROA_1_8_LOAD]]
52
+ ;
53
+ entry:
54
+ %a = alloca [2 x ptr ]
55
+ %a.gep1 = getelementptr [2 x ptr ], ptr %a , i32 0 , i32 1
56
+ store ptr %v , ptr %a.gep1
57
+ store ptr null , ptr %a
58
+ %load = load volatile ptr , ptr %a.gep1 , !noundef !0
59
+ ret ptr %load
60
+ }
61
+
62
+ define ptr @turn_nonnull_noundef_into_assume (ptr %arg ) {
63
+ ; CHECK-LABEL: @turn_nonnull_noundef_into_assume(
64
+ ; CHECK-NEXT: entry:
65
+ ; CHECK-NEXT: [[BUF_0_COPYLOAD:%.*]] = load ptr, ptr [[ARG:%.*]], align 8
66
+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ne ptr [[BUF_0_COPYLOAD]], null
67
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
68
+ ; CHECK-NEXT: ret ptr [[BUF_0_COPYLOAD]]
69
+ ;
70
+ entry:
71
+ %buf = alloca ptr
72
+ call void @llvm.memcpy.p0.p0.i64 (ptr align 8 %buf , ptr align 8 %arg , i64 8 , i1 false )
73
+ %ret = load ptr , ptr %buf , align 8 , !nonnull !0 , !noundef !0
74
+ ret ptr %ret
75
+ }
76
+
77
+ ; FIXME: Should not produce assume.
78
+ define ptr @dont_turn_nonnull_without_noundef_into_assume (ptr %arg ) {
79
+ ; CHECK-LABEL: @dont_turn_nonnull_without_noundef_into_assume(
30
80
; CHECK-NEXT: entry:
31
81
; CHECK-NEXT: [[BUF_0_COPYLOAD:%.*]] = load ptr, ptr [[ARG:%.*]], align 8
32
82
; CHECK-NEXT: [[TMP0:%.*]] = icmp ne ptr [[BUF_0_COPYLOAD]], null
0 commit comments