@@ -17,12 +17,13 @@ pub enum SmallEnum {
1717// CHECK-LABEL: @check_to_enum(
1818#[ no_mangle]
1919pub 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
2324 // OPT: call void @llvm.assume(i1 %1)
24- // DBG -NOT: icmp
25- // DBG -NOT: assume
25+ // CHECK -NOT: icmp
26+ // CHECK -NOT: assume
2627 // CHECK: ret i8 %x
2728
2829 transmute ( x)
@@ -31,12 +32,13 @@ pub unsafe fn check_to_enum(x: i8) -> SmallEnum {
3132// CHECK-LABEL: @check_from_enum(
3233#[ no_mangle]
3334pub 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
3739 // OPT: call void @llvm.assume(i1 %1)
38- // DBG -NOT: icmp
39- // DBG -NOT: assume
40+ // CHECK -NOT: icmp
41+ // CHECK -NOT: assume
4042 // CHECK: ret i8 %x
4143
4244 transmute ( x)
@@ -45,12 +47,13 @@ pub unsafe fn check_from_enum(x: SmallEnum) -> i8 {
4547// CHECK-LABEL: @check_to_ordering(
4648#[ no_mangle]
4749pub 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
5457 // CHECK: ret i8 %x
5558
5659 transmute ( x)
@@ -59,12 +62,13 @@ pub unsafe fn check_to_ordering(x: u8) -> std::cmp::Ordering {
5962// CHECK-LABEL: @check_from_ordering(
6063#[ no_mangle]
6164pub 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
6872 // CHECK: ret i8 %x
6973
7074 transmute ( x)
@@ -98,14 +102,15 @@ pub enum Minus100ToPlus100 {
98102// CHECK-LABEL: @check_enum_from_char(
99103#[ no_mangle]
100104pub unsafe fn check_enum_from_char ( x : char ) -> Minus100ToPlus100 {
105+ // CHECK-NOT: icmp
106+ // CHECK-NOT: assume
101107 // OPT: %0 = icmp ule i32 %x, 1114111
102108 // 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
109114 // CHECK: ret i32 %x
110115
111116 transmute ( x)
@@ -114,14 +119,15 @@ pub unsafe fn check_enum_from_char(x: char) -> Minus100ToPlus100 {
114119// CHECK-LABEL: @check_enum_to_char(
115120#[ no_mangle]
116121pub 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
120128 // 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
125131 // CHECK: ret i32 %x
126132
127133 transmute ( x)
@@ -130,16 +136,20 @@ pub unsafe fn check_enum_to_char(x: Minus100ToPlus100) -> char {
130136// CHECK-LABEL: @check_swap_pair(
131137#[ no_mangle]
132138pub unsafe fn check_swap_pair ( x : ( char , NonZero < u32 > ) ) -> ( NonZero < u32 > , char ) {
139+ // CHECK-NOT: icmp
140+ // CHECK-NOT: assume
133141 // OPT: %0 = icmp ule i32 %x.0, 1114111
134142 // 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
138145 // 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
143153 // CHECK: %[[P1:.+]] = insertvalue { i32, i32 } poison, i32 %x.0, 0
144154 // CHECK: %[[P2:.+]] = insertvalue { i32, i32 } %[[P1]], i32 %x.1, 1
145155 // CHECK: ret { i32, i32 } %[[P2]]
@@ -150,14 +160,15 @@ pub unsafe fn check_swap_pair(x: (char, NonZero<u32>)) -> (NonZero<u32>, char) {
150160// CHECK-LABEL: @check_bool_from_ordering(
151161#[ no_mangle]
152162pub 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
156169 // 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
161172 // CHECK: %[[R:.+]] = trunc i8 %x to i1
162173 // CHECK: ret i1 %[[R]]
163174
@@ -168,14 +179,15 @@ pub unsafe fn check_bool_from_ordering(x: std::cmp::Ordering) -> bool {
168179#[ no_mangle]
169180pub unsafe fn check_bool_to_ordering ( x : bool ) -> std:: cmp:: Ordering {
170181 // CHECK: %_0 = zext i1 %x to i8
182+ // CHECK-NOT: icmp
183+ // CHECK-NOT: assume
171184 // OPT: %0 = icmp ule i8 %_0, 1
172185 // 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
179191 // CHECK: ret i8 %_0
180192
181193 transmute ( x)
0 commit comments