@@ -18,6 +18,7 @@ declare void @func_cold(i32*) cold willreturn nounwind
18
18
declare void @func_strbool (i32* ) "no-jump-tables"
19
19
declare void @func_many (i32* ) "no-jump-tables" nounwind "less-precise-fpmad" willreturn norecurse
20
20
declare void @func_argattr (i32* align 8 , i32* nonnull ) nounwind
21
+ declare void @func_argattr2 (i32* noundef align 8 , i32* noundef nonnull ) nounwind
21
22
declare void @may_throw ()
22
23
23
24
define void @test (i32* %P , i32* %P1 , i32* %P2 , i32* %P3 ) {
@@ -35,12 +36,15 @@ define void @test(i32* %P, i32* %P1, i32* %P2, i32* %P3) {
35
36
; BASIC-NEXT: call void @func_strbool(i32* [[P1]])
36
37
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 32) ]
37
38
; BASIC-NEXT: call void @func(i32* dereferenceable(32) [[P]], i32* dereferenceable(8) [[P]])
38
- ; BASIC-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P1]], i64 8) ]
39
39
; BASIC-NEXT: call void @func_many(i32* align 8 [[P1]])
40
- ; BASIC-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P2]], i64 8), "nonnull"(i32* [[P3]]) ]
40
+ ; BASIC-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
41
+ ; BASIC-NEXT: call void @func_many(i32* noundef align 8 [[P1]])
41
42
; BASIC-NEXT: call void @func_argattr(i32* [[P2]], i32* [[P3]])
42
- ; BASIC-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]) ]
43
+ ; BASIC-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P2]]), "align"(i32* [[P2]], i64 8), "noundef"(i32* [[P3]]), "nonnull"(i32* [[P3]]) ]
44
+ ; BASIC-NEXT: call void @func_argattr2(i32* [[P2]], i32* [[P3]])
43
45
; BASIC-NEXT: call void @func(i32* nonnull [[P1]], i32* nonnull [[P]])
46
+ ; BASIC-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]), "noundef"(i32* [[P]]) ]
47
+ ; BASIC-NEXT: call void @func(i32* noundef nonnull [[P1]], i32* noundef nonnull [[P]])
44
48
; BASIC-NEXT: ret void
45
49
;
46
50
; ALL-LABEL: define {{[^@]+}}@test
@@ -57,12 +61,17 @@ define void @test(i32* %P, i32* %P1, i32* %P2, i32* %P3) {
57
61
; ALL-NEXT: call void @func_strbool(i32* [[P1]])
58
62
; ALL-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 32) ]
59
63
; ALL-NEXT: call void @func(i32* dereferenceable(32) [[P]], i32* dereferenceable(8) [[P]])
60
- ; ALL-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P1]], i64 8), " norecurse"(), "nounwind"(), "willreturn"() ]
64
+ ; ALL-NEXT: call void @llvm.assume(i1 true) [ "norecurse"(), "nounwind"(), "willreturn"() ]
61
65
; ALL-NEXT: call void @func_many(i32* align 8 [[P1]])
62
- ; ALL-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P2]], i64 8), "nonnull"(i32* [[P3]]), "nounwind"() ]
66
+ ; ALL-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P1]]), "align"(i32* [[P1]], i64 8), "norecurse"(), "nounwind"(), "willreturn"() ]
67
+ ; ALL-NEXT: call void @func_many(i32* noundef align 8 [[P1]])
68
+ ; ALL-NEXT: call void @llvm.assume(i1 true) [ "nounwind"() ]
63
69
; ALL-NEXT: call void @func_argattr(i32* [[P2]], i32* [[P3]])
64
- ; ALL-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]) ]
70
+ ; ALL-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P2]]), "align"(i32* [[P2]], i64 8), "noundef"(i32* [[P3]]), "nonnull"(i32* [[P3]]), "nounwind"() ]
71
+ ; ALL-NEXT: call void @func_argattr2(i32* [[P2]], i32* [[P3]])
65
72
; ALL-NEXT: call void @func(i32* nonnull [[P1]], i32* nonnull [[P]])
73
+ ; ALL-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]), "noundef"(i32* [[P]]) ]
74
+ ; ALL-NEXT: call void @func(i32* noundef nonnull [[P1]], i32* noundef nonnull [[P]])
66
75
; ALL-NEXT: ret void
67
76
;
68
77
; WITH-AC-LABEL: define {{[^@]+}}@test
@@ -79,12 +88,15 @@ define void @test(i32* %P, i32* %P1, i32* %P2, i32* %P3) {
79
88
; WITH-AC-NEXT: call void @func_strbool(i32* [[P1]])
80
89
; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 32) ]
81
90
; WITH-AC-NEXT: call void @func(i32* dereferenceable(32) [[P]], i32* dereferenceable(8) [[P]])
82
- ; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P1]], i64 8) ]
83
91
; WITH-AC-NEXT: call void @func_many(i32* align 8 [[P1]])
84
- ; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P2]], i64 8), "nonnull"(i32* [[P3]]) ]
92
+ ; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
93
+ ; WITH-AC-NEXT: call void @func_many(i32* noundef align 8 [[P1]])
85
94
; WITH-AC-NEXT: call void @func_argattr(i32* [[P2]], i32* [[P3]])
86
- ; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]) ]
95
+ ; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P2]]), "align"(i32* [[P2]], i64 8), "noundef"(i32* [[P3]]), "nonnull"(i32* [[P3]]) ]
96
+ ; WITH-AC-NEXT: call void @func_argattr2(i32* [[P2]], i32* [[P3]])
87
97
; WITH-AC-NEXT: call void @func(i32* nonnull [[P1]], i32* nonnull [[P]])
98
+ ; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]), "noundef"(i32* [[P]]) ]
99
+ ; WITH-AC-NEXT: call void @func(i32* noundef nonnull [[P1]], i32* noundef nonnull [[P]])
88
100
; WITH-AC-NEXT: ret void
89
101
;
90
102
; CROSS-BLOCK-LABEL: define {{[^@]+}}@test
@@ -101,12 +113,15 @@ define void @test(i32* %P, i32* %P1, i32* %P2, i32* %P3) {
101
113
; CROSS-BLOCK-NEXT: call void @func_strbool(i32* [[P1]])
102
114
; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 32) ]
103
115
; CROSS-BLOCK-NEXT: call void @func(i32* dereferenceable(32) [[P]], i32* dereferenceable(8) [[P]])
104
- ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P1]], i64 8) ]
105
116
; CROSS-BLOCK-NEXT: call void @func_many(i32* align 8 [[P1]])
106
- ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P2]], i64 8), "nonnull"(i32* [[P3]]) ]
117
+ ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
118
+ ; CROSS-BLOCK-NEXT: call void @func_many(i32* noundef align 8 [[P1]])
107
119
; CROSS-BLOCK-NEXT: call void @func_argattr(i32* [[P2]], i32* [[P3]])
108
- ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]) ]
120
+ ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P2]]), "align"(i32* [[P2]], i64 8), "noundef"(i32* [[P3]]), "nonnull"(i32* [[P3]]) ]
121
+ ; CROSS-BLOCK-NEXT: call void @func_argattr2(i32* [[P2]], i32* [[P3]])
109
122
; CROSS-BLOCK-NEXT: call void @func(i32* nonnull [[P1]], i32* nonnull [[P]])
123
+ ; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]), "noundef"(i32* [[P]]) ]
124
+ ; CROSS-BLOCK-NEXT: call void @func(i32* noundef nonnull [[P1]], i32* noundef nonnull [[P]])
110
125
; CROSS-BLOCK-NEXT: ret void
111
126
;
112
127
; FULL-SIMPLIFY-LABEL: define {{[^@]+}}@test
@@ -121,11 +136,15 @@ define void @test(i32* %P, i32* %P1, i32* %P2, i32* %P3) {
121
136
; FULL-SIMPLIFY-NEXT: call void @func_strbool(i32* [[P1]])
122
137
; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 32) ]
123
138
; FULL-SIMPLIFY-NEXT: call void @func(i32* dereferenceable(32) [[P]], i32* dereferenceable(8) [[P]])
124
- ; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P1]], i64 8), "align"(i32* [[P2]], i64 8), "nonnull"(i32* [[P3]]) ]
125
139
; FULL-SIMPLIFY-NEXT: call void @func_many(i32* align 8 [[P1]])
140
+ ; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
141
+ ; FULL-SIMPLIFY-NEXT: call void @func_many(i32* noundef align 8 [[P1]])
126
142
; FULL-SIMPLIFY-NEXT: call void @func_argattr(i32* [[P2]], i32* [[P3]])
127
- ; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]) ]
143
+ ; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "noundef"(i32* [[P2]]), "align"(i32* [[P2]], i64 8), "noundef"(i32* [[P3]]), "nonnull"(i32* [[P3]]) ]
144
+ ; FULL-SIMPLIFY-NEXT: call void @func_argattr2(i32* [[P2]], i32* [[P3]])
128
145
; FULL-SIMPLIFY-NEXT: call void @func(i32* nonnull [[P1]], i32* nonnull [[P]])
146
+ ; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P1]]), "noundef"(i32* [[P]]) ]
147
+ ; FULL-SIMPLIFY-NEXT: call void @func(i32* noundef nonnull [[P1]], i32* noundef nonnull [[P]])
129
148
; FULL-SIMPLIFY-NEXT: ret void
130
149
;
131
150
call void @func (i32* nonnull dereferenceable (16 ) %P , i32* null )
@@ -136,8 +155,11 @@ define void @test(i32* %P, i32* %P1, i32* %P2, i32* %P3) {
136
155
call void @func_strbool (i32* %P1 )
137
156
call void @func (i32* dereferenceable (32 ) %P , i32* dereferenceable (8 ) %P )
138
157
call void @func_many (i32* align 8 %P1 )
158
+ call void @func_many (i32* align 8 noundef %P1 )
139
159
call void @func_argattr (i32* %P2 , i32* %P3 )
160
+ call void @func_argattr2 (i32* %P2 , i32* %P3 )
140
161
call void @func (i32* nonnull %P1 , i32* nonnull %P )
162
+ call void @func (i32* nonnull noundef %P1 , i32* nonnull noundef %P )
141
163
ret void
142
164
}
143
165
0 commit comments