1
1
//@ revisions: OPT DBG
2
2
//@ [OPT] compile-flags: -C opt-level=3 -C no-prepopulate-passes
3
+ //@ [OPT] min-llvm-version: 19 (for range parameter metadata)
3
4
//@ [DBG] compile-flags: -C opt-level=0 -C no-prepopulate-passes
4
5
//@ only-64bit (so I don't need to worry about usize)
5
6
#![ crate_type = "lib" ]
@@ -17,26 +18,25 @@ pub enum SmallEnum {
17
18
// CHECK-LABEL: @check_to_enum(
18
19
#[ no_mangle]
19
20
pub unsafe fn check_to_enum ( x : i8 ) -> SmallEnum {
21
+ // CHECK-NOT: icmp
22
+ // CHECK-NOT: assume
20
23
// OPT: %0 = icmp uge i8 %x, 10
21
24
// OPT: call void @llvm.assume(i1 %0)
22
25
// OPT: %1 = icmp ule i8 %x, 12
23
26
// OPT: call void @llvm.assume(i1 %1)
24
- // DBG -NOT: icmp
25
- // DBG -NOT: assume
27
+ // CHECK -NOT: icmp
28
+ // CHECK -NOT: assume
26
29
// CHECK: ret i8 %x
27
30
28
31
transmute ( x)
29
32
}
30
33
31
34
// CHECK-LABEL: @check_from_enum(
35
+ // OPT-SAME: range(i8 10, 13){{.+}}%x
32
36
#[ no_mangle]
33
37
pub unsafe fn check_from_enum ( x : SmallEnum ) -> i8 {
34
- // OPT: %0 = icmp uge i8 %x, 10
35
- // OPT: call void @llvm.assume(i1 %0)
36
- // OPT: %1 = icmp ule i8 %x, 12
37
- // OPT: call void @llvm.assume(i1 %1)
38
- // DBG-NOT: icmp
39
- // DBG-NOT: assume
38
+ // CHECK-NOT: icmp
39
+ // CHECK-NOT: assume
40
40
// CHECK: ret i8 %x
41
41
42
42
transmute ( x)
@@ -45,26 +45,25 @@ pub unsafe fn check_from_enum(x: SmallEnum) -> i8 {
45
45
// CHECK-LABEL: @check_to_ordering(
46
46
#[ no_mangle]
47
47
pub unsafe fn check_to_ordering ( x : u8 ) -> std:: cmp:: Ordering {
48
+ // CHECK-NOT: icmp
49
+ // CHECK-NOT: assume
48
50
// OPT: %0 = icmp uge i8 %x, -1
49
51
// OPT: %1 = icmp ule i8 %x, 1
50
52
// OPT: %2 = or i1 %0, %1
51
53
// OPT: call void @llvm.assume(i1 %2)
52
- // DBG -NOT: icmp
53
- // DBG -NOT: assume
54
+ // CHECK -NOT: icmp
55
+ // CHECK -NOT: assume
54
56
// CHECK: ret i8 %x
55
57
56
58
transmute ( x)
57
59
}
58
60
59
61
// CHECK-LABEL: @check_from_ordering(
62
+ // OPT-SAME: range(i8 -1, 2){{.+}}%x
60
63
#[ no_mangle]
61
64
pub unsafe fn check_from_ordering ( x : std:: cmp:: Ordering ) -> u8 {
62
- // OPT: %0 = icmp uge i8 %x, -1
63
- // OPT: %1 = icmp ule i8 %x, 1
64
- // OPT: %2 = or i1 %0, %1
65
- // OPT: call void @llvm.assume(i1 %2)
66
- // DBG-NOT: icmp
67
- // DBG-NOT: assume
65
+ // CHECK-NOT: icmp
66
+ // CHECK-NOT: assume
68
67
// CHECK: ret i8 %x
69
68
70
69
transmute ( x)
@@ -96,50 +95,50 @@ pub enum Minus100ToPlus100 {
96
95
}
97
96
98
97
// CHECK-LABEL: @check_enum_from_char(
98
+ // OPT-SAME: range(i32 0, 1114112){{.+}}%x
99
99
#[ no_mangle]
100
100
pub unsafe fn check_enum_from_char ( x : char ) -> Minus100ToPlus100 {
101
- // OPT: %0 = icmp ule i32 %x, 1114111
102
- // OPT: call void @llvm. assume(i1 %0)
103
- // OPT: %1 = icmp uge i32 %x, -100
104
- // OPT: %2 = icmp ule i32 %x, 100
105
- // OPT: %3 = or i1 %1 , %2
106
- // OPT: call void @llvm.assume(i1 %3 )
107
- // DBG -NOT: icmp
108
- // DBG -NOT: assume
101
+ // CHECK-NOT: icmp
102
+ // CHECK-NOT: assume
103
+ // OPT: %0 = icmp uge i32 %x, -100
104
+ // OPT: %1 = icmp ule i32 %x, 100
105
+ // OPT: %2 = or i1 %0 , %1
106
+ // OPT: call void @llvm.assume(i1 %2 )
107
+ // CHECK -NOT: icmp
108
+ // CHECK -NOT: assume
109
109
// CHECK: ret i32 %x
110
110
111
111
transmute ( x)
112
112
}
113
113
114
114
// CHECK-LABEL: @check_enum_to_char(
115
+ // OPT-SAME: range(i32 -100, 101){{.+}}%x
115
116
#[ no_mangle]
116
117
pub unsafe fn check_enum_to_char ( x : Minus100ToPlus100 ) -> char {
117
- // OPT: %0 = icmp uge i32 %x, -100
118
- // OPT: %1 = icmp ule i32 %x, 100
119
- // OPT: %2 = or i1 %0, %1
120
- // OPT: call void @llvm.assume(i1 %2)
121
- // OPT: %3 = icmp ule i32 %x, 1114111
122
- // OPT: call void @llvm.assume(i1 %3)
123
- // DBG-NOT: icmp
124
- // DBG-NOT: assume
118
+ // CHECK-NOT: icmp
119
+ // CHECK-NOT: assume
120
+ // OPT: %0 = icmp ule i32 %x, 1114111
121
+ // OPT: call void @llvm.assume(i1 %0)
122
+ // CHECK-NOT: icmp
123
+ // CHECK-NOT: assume
125
124
// CHECK: ret i32 %x
126
125
127
126
transmute ( x)
128
127
}
129
128
130
129
// CHECK-LABEL: @check_swap_pair(
130
+ // OPT-SAME: range(i32 0, 1114112){{.+}}%x.0
131
+ // OPT-SAME: range(i32 1, 0){{.+}}%x.1
131
132
#[ no_mangle]
132
133
pub unsafe fn check_swap_pair ( x : ( char , NonZero < u32 > ) ) -> ( NonZero < u32 > , char ) {
133
- // OPT: %0 = icmp ule i32 %x.0, 1114111
134
+ // CHECK-NOT: icmp
135
+ // CHECK-NOT: assume
136
+ // OPT: %0 = icmp uge i32 %x.0, 1
134
137
// OPT: call void @llvm.assume(i1 %0)
135
- // OPT: %1 = icmp uge i32 %x.0, 1
138
+ // OPT: %1 = icmp ule i32 %x.1, 1114111
136
139
// OPT: call void @llvm.assume(i1 %1)
137
- // OPT: %2 = icmp uge i32 %x.1, 1
138
- // OPT: call void @llvm.assume(i1 %2)
139
- // OPT: %3 = icmp ule i32 %x.1, 1114111
140
- // OPT: call void @llvm.assume(i1 %3)
141
- // DBG-NOT: icmp
142
- // DBG-NOT: assume
140
+ // CHECK-NOT: icmp
141
+ // CHECK-NOT: assume
143
142
// CHECK: %[[P1:.+]] = insertvalue { i32, i32 } poison, i32 %x.0, 0
144
143
// CHECK: %[[P2:.+]] = insertvalue { i32, i32 } %[[P1]], i32 %x.1, 1
145
144
// CHECK: ret { i32, i32 } %[[P2]]
@@ -148,34 +147,34 @@ pub unsafe fn check_swap_pair(x: (char, NonZero<u32>)) -> (NonZero<u32>, char) {
148
147
}
149
148
150
149
// CHECK-LABEL: @check_bool_from_ordering(
150
+ // OPT-SAME: range(i8 -1, 2){{.+}}%x
151
151
#[ no_mangle]
152
152
pub unsafe fn check_bool_from_ordering ( x : std:: cmp:: Ordering ) -> bool {
153
- // OPT: %0 = icmp uge i8 %x, -1
154
- // OPT: %1 = icmp ule i8 %x, 1
155
- // OPT: %2 = or i1 %0, %1
156
- // OPT: call void @llvm.assume(i1 %2)
157
- // OPT: %3 = icmp ule i8 %x, 1
158
- // OPT: call void @llvm.assume(i1 %3)
159
- // DBG-NOT: icmp
160
- // DBG-NOT: assume
153
+ // CHECK-NOT: icmp
154
+ // CHECK-NOT: assume
155
+ // OPT: %0 = icmp ule i8 %x, 1
156
+ // OPT: call void @llvm.assume(i1 %0)
157
+ // CHECK-NOT: icmp
158
+ // CHECK-NOT: assume
161
159
// CHECK: %[[R:.+]] = trunc i8 %x to i1
162
160
// CHECK: ret i1 %[[R]]
163
161
164
162
transmute ( x)
165
163
}
166
164
167
165
// CHECK-LABEL: @check_bool_to_ordering(
166
+ // OPT-SAME: i1 {{.+}} %x
168
167
#[ no_mangle]
169
168
pub unsafe fn check_bool_to_ordering ( x : bool ) -> std:: cmp:: Ordering {
170
169
// CHECK: %_0 = zext i1 %x to i8
171
- // OPT: %0 = icmp ule i8 %_0, 1
172
- // OPT: call void @llvm. assume(i1 %0)
173
- // OPT: %1 = icmp uge i8 %_0, -1
174
- // OPT: %2 = icmp ule i8 %_0, 1
175
- // OPT: %3 = or i1 %1 , %2
176
- // OPT: call void @llvm.assume(i1 %3 )
177
- // DBG -NOT: icmp
178
- // DBG -NOT: assume
170
+ // CHECK-NOT: icmp
171
+ // CHECK-NOT: assume
172
+ // OPT: %0 = icmp uge i8 %_0, -1
173
+ // OPT: %1 = icmp ule i8 %_0, 1
174
+ // OPT: %2 = or i1 %0 , %1
175
+ // OPT: call void @llvm.assume(i1 %2 )
176
+ // CHECK -NOT: icmp
177
+ // CHECK -NOT: assume
179
178
// CHECK: ret i8 %_0
180
179
181
180
transmute ( x)
0 commit comments