@@ -17,12 +17,13 @@ pub enum SmallEnum {
17
17
// CHECK-LABEL: @check_to_enum(
18
18
#[ no_mangle]
19
19
pub unsafe fn check_to_enum ( x : i8 ) -> SmallEnum {
20
- // OPT: %0 = icmp uge i8 %x, 10
21
- // OPT: call void @llvm.assume(i1 %0)
22
- // OPT: %1 = icmp ule i8 %x, 12
20
+ // CHECK-NOT: icmp
21
+ // CHECK-NOT: assume
22
+ // OPT: %0 = sub i8 %x, 10
23
+ // OPT: %1 = icmp ule i8 %0, 2
23
24
// OPT: call void @llvm.assume(i1 %1)
24
- // DBG -NOT: icmp
25
- // DBG -NOT: assume
25
+ // CHECK -NOT: icmp
26
+ // CHECK -NOT: assume
26
27
// CHECK: ret i8 %x
27
28
28
29
transmute ( x)
@@ -31,12 +32,13 @@ pub unsafe fn check_to_enum(x: i8) -> SmallEnum {
31
32
// CHECK-LABEL: @check_from_enum(
32
33
#[ no_mangle]
33
34
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
35
+ // CHECK-NOT: icmp
36
+ // CHECK-NOT: assume
37
+ // OPT: %0 = sub i8 %x, 10
38
+ // OPT: %1 = icmp ule i8 %0, 2
37
39
// OPT: call void @llvm.assume(i1 %1)
38
- // DBG -NOT: icmp
39
- // DBG -NOT: assume
40
+ // CHECK -NOT: icmp
41
+ // CHECK -NOT: assume
40
42
// CHECK: ret i8 %x
41
43
42
44
transmute ( x)
@@ -45,12 +47,13 @@ pub unsafe fn check_from_enum(x: SmallEnum) -> i8 {
45
47
// CHECK-LABEL: @check_to_ordering(
46
48
#[ no_mangle]
47
49
pub unsafe fn check_to_ordering ( x : u8 ) -> std:: cmp:: Ordering {
48
- // OPT: %0 = icmp uge i8 %x, -1
49
- // OPT: %1 = icmp ule i8 %x, 1
50
- // OPT: %2 = or i1 %0, %1
51
- // OPT: call void @llvm.assume(i1 %2)
52
- // DBG-NOT: icmp
53
- // DBG-NOT: assume
50
+ // CHECK-NOT: icmp
51
+ // CHECK-NOT: assume
52
+ // OPT: %0 = sub i8 %x, -1
53
+ // OPT: %1 = icmp ule i8 %0, 2
54
+ // OPT: call void @llvm.assume(i1 %1)
55
+ // CHECK-NOT: icmp
56
+ // CHECK-NOT: assume
54
57
// CHECK: ret i8 %x
55
58
56
59
transmute ( x)
@@ -59,12 +62,13 @@ pub unsafe fn check_to_ordering(x: u8) -> std::cmp::Ordering {
59
62
// CHECK-LABEL: @check_from_ordering(
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
67
+ // OPT: %0 = sub i8 %x, -1
68
+ // OPT: %1 = icmp ule i8 %0, 2
69
+ // OPT: call void @llvm.assume(i1 %1)
70
+ // CHECK-NOT: icmp
71
+ // CHECK-NOT: assume
68
72
// CHECK: ret i8 %x
69
73
70
74
transmute ( x)
@@ -98,14 +102,15 @@ pub enum Minus100ToPlus100 {
98
102
// CHECK-LABEL: @check_enum_from_char(
99
103
#[ no_mangle]
100
104
pub unsafe fn check_enum_from_char ( x : char ) -> Minus100ToPlus100 {
105
+ // CHECK-NOT: icmp
106
+ // CHECK-NOT: assume
101
107
// OPT: %0 = icmp ule i32 %x, 1114111
102
108
// 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
109
+ // OPT: %1 = sub i32 %x, -100
110
+ // OPT: %2 = icmp ule i32 %1, 200
111
+ // OPT: call void @llvm.assume(i1 %2)
112
+ // CHECK-NOT: icmp
113
+ // CHECK-NOT: assume
109
114
// CHECK: ret i32 %x
110
115
111
116
transmute ( x)
@@ -114,14 +119,15 @@ pub unsafe fn check_enum_from_char(x: char) -> Minus100ToPlus100 {
114
119
// CHECK-LABEL: @check_enum_to_char(
115
120
#[ no_mangle]
116
121
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
122
+ // CHECK-NOT: icmp
123
+ // CHECK-NOT: assume
124
+ // OPT: %0 = sub i32 %x, -100
125
+ // OPT: %1 = icmp ule i32 %0, 200
126
+ // OPT: call void @llvm.assume(i1 %1)
127
+ // OPT: %2 = icmp ule i32 %x, 1114111
120
128
// 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
129
+ // CHECK-NOT: icmp
130
+ // CHECK-NOT: assume
125
131
// CHECK: ret i32 %x
126
132
127
133
transmute ( x)
@@ -130,16 +136,20 @@ pub unsafe fn check_enum_to_char(x: Minus100ToPlus100) -> char {
130
136
// CHECK-LABEL: @check_swap_pair(
131
137
#[ no_mangle]
132
138
pub unsafe fn check_swap_pair ( x : ( char , NonZero < u32 > ) ) -> ( NonZero < u32 > , char ) {
139
+ // CHECK-NOT: icmp
140
+ // CHECK-NOT: assume
133
141
// OPT: %0 = icmp ule i32 %x.0, 1114111
134
142
// OPT: call void @llvm.assume(i1 %0)
135
- // OPT: %1 = icmp uge i32 %x.0, 1
136
- // OPT: call void @llvm.assume(i1 %1)
137
- // OPT: %2 = icmp uge i32 %x.1, 1
143
+ // OPT: %1 = sub i32 %x.0, 1
144
+ // OPT: %2 = icmp ule i32 %1, -2
138
145
// 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
146
+ // OPT: %3 = sub i32 %x.1, 1
147
+ // OPT: %4 = icmp ule i32 %3, -2
148
+ // OPT: call void @llvm.assume(i1 %4)
149
+ // OPT: %5 = icmp ule i32 %x.1, 1114111
150
+ // OPT: call void @llvm.assume(i1 %5)
151
+ // CHECK-NOT: icmp
152
+ // CHECK-NOT: assume
143
153
// CHECK: %[[P1:.+]] = insertvalue { i32, i32 } poison, i32 %x.0, 0
144
154
// CHECK: %[[P2:.+]] = insertvalue { i32, i32 } %[[P1]], i32 %x.1, 1
145
155
// CHECK: ret { i32, i32 } %[[P2]]
@@ -150,14 +160,15 @@ pub unsafe fn check_swap_pair(x: (char, NonZero<u32>)) -> (NonZero<u32>, char) {
150
160
// CHECK-LABEL: @check_bool_from_ordering(
151
161
#[ no_mangle]
152
162
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
163
+ // CHECK-NOT: icmp
164
+ // CHECK-NOT: assume
165
+ // OPT: %0 = sub i8 %x, -1
166
+ // OPT: %1 = icmp ule i8 %0, 2
167
+ // OPT: call void @llvm.assume(i1 %1)
168
+ // OPT: %2 = icmp ule i8 %x, 1
156
169
// 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
170
+ // CHECK-NOT: icmp
171
+ // CHECK-NOT: assume
161
172
// CHECK: %[[R:.+]] = trunc i8 %x to i1
162
173
// CHECK: ret i1 %[[R]]
163
174
@@ -168,14 +179,15 @@ pub unsafe fn check_bool_from_ordering(x: std::cmp::Ordering) -> bool {
168
179
#[ no_mangle]
169
180
pub unsafe fn check_bool_to_ordering ( x : bool ) -> std:: cmp:: Ordering {
170
181
// CHECK: %_0 = zext i1 %x to i8
182
+ // CHECK-NOT: icmp
183
+ // CHECK-NOT: assume
171
184
// OPT: %0 = icmp ule i8 %_0, 1
172
185
// 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
186
+ // OPT: %1 = sub i8 %_0, -1
187
+ // OPT: %2 = icmp ule i8 %1, 2
188
+ // OPT: call void @llvm.assume(i1 %2)
189
+ // CHECK-NOT: icmp
190
+ // CHECK-NOT: assume
179
191
// CHECK: ret i8 %_0
180
192
181
193
transmute ( x)
0 commit comments