1
1
//@ compile-flags: -C opt-level=1 -Z merge-functions=disabled
2
2
//@ only-x86_64
3
+ //@ min-llvm-version: 20
3
4
4
5
#![ crate_type = "lib" ]
5
6
@@ -65,12 +66,7 @@ pub fn check_ge_direct(a: TwoTuple, b: TwoTuple) -> bool {
65
66
}
66
67
67
68
//
68
- // These ones are harder, since there are more intermediate values to remove.
69
- //
70
- // `<` seems to be getting lucky right now, so test that doesn't regress.
71
- //
72
- // The others, however, aren't managing to optimize away the extra `select`s yet.
73
- // See <https://github.com/rust-lang/rust/issues/106107> for more about this.
69
+ // These used to not optimize as well, but thanks to LLVM 20 they work now 🎉
74
70
//
75
71
76
72
// CHECK-LABEL: @check_lt_via_cmp
@@ -89,34 +85,34 @@ pub fn check_lt_via_cmp(a: TwoTuple, b: TwoTuple) -> bool {
89
85
// CHECK-SAME: (i16 noundef %[[A0:.+]], i16 noundef %[[A1:.+]], i16 noundef %[[B0:.+]], i16 noundef %[[B1:.+]])
90
86
#[ no_mangle]
91
87
pub fn check_le_via_cmp ( a : TwoTuple , b : TwoTuple ) -> bool {
92
- // FIXME- CHECK-DAG: %[[EQ:.+]] = icmp eq i16 %[[A0]], %[[B0]]
93
- // FIXME- CHECK-DAG: %[[CMP0:.+]] = icmp sle i16 %[[A0]], %[[B0]]
94
- // FIXME- CHECK-DAG: %[[CMP1:.+]] = icmp ule i16 %[[A1]], %[[B1]]
95
- // FIXME- CHECK: %[[R:.+]] = select i1 %[[EQ]], i1 %[[CMP1]], i1 %[[CMP0]]
96
- // FIXME- CHECK: ret i1 %[[R]]
88
+ // CHECK-DAG: %[[EQ:.+]] = icmp eq i16 %[[A0]], %[[B0]]
89
+ // CHECK-DAG: %[[CMP0:.+]] = icmp sle i16 %[[A0]], %[[B0]]
90
+ // CHECK-DAG: %[[CMP1:.+]] = icmp ule i16 %[[A1]], %[[B1]]
91
+ // CHECK: %[[R:.+]] = select i1 %[[EQ]], i1 %[[CMP1]], i1 %[[CMP0]]
92
+ // CHECK: ret i1 %[[R]]
97
93
Ord :: cmp ( & a, & b) . is_le ( )
98
94
}
99
95
100
96
// CHECK-LABEL: @check_gt_via_cmp
101
97
// CHECK-SAME: (i16 noundef %[[A0:.+]], i16 noundef %[[A1:.+]], i16 noundef %[[B0:.+]], i16 noundef %[[B1:.+]])
102
98
#[ no_mangle]
103
99
pub fn check_gt_via_cmp ( a : TwoTuple , b : TwoTuple ) -> bool {
104
- // FIXME- CHECK-DAG: %[[EQ:.+]] = icmp eq i16 %[[A0]], %[[B0]]
105
- // FIXME- CHECK-DAG: %[[CMP0:.+]] = icmp sgt i16 %[[A0]], %[[B0]]
106
- // FIXME- CHECK-DAG: %[[CMP1:.+]] = icmp ugt i16 %[[A1]], %[[B1]]
107
- // FIXME- CHECK: %[[R:.+]] = select i1 %[[EQ]], i1 %[[CMP1]], i1 %[[CMP0]]
108
- // FIXME- CHECK: ret i1 %[[R]]
100
+ // CHECK-DAG: %[[EQ:.+]] = icmp eq i16 %[[A0]], %[[B0]]
101
+ // CHECK-DAG: %[[CMP0:.+]] = icmp sgt i16 %[[A0]], %[[B0]]
102
+ // CHECK-DAG: %[[CMP1:.+]] = icmp ugt i16 %[[A1]], %[[B1]]
103
+ // CHECK: %[[R:.+]] = select i1 %[[EQ]], i1 %[[CMP1]], i1 %[[CMP0]]
104
+ // CHECK: ret i1 %[[R]]
109
105
Ord :: cmp ( & a, & b) . is_gt ( )
110
106
}
111
107
112
108
// CHECK-LABEL: @check_ge_via_cmp
113
109
// CHECK-SAME: (i16 noundef %[[A0:.+]], i16 noundef %[[A1:.+]], i16 noundef %[[B0:.+]], i16 noundef %[[B1:.+]])
114
110
#[ no_mangle]
115
111
pub fn check_ge_via_cmp ( a : TwoTuple , b : TwoTuple ) -> bool {
116
- // FIXME- CHECK-DAG: %[[EQ:.+]] = icmp eq i16 %[[A0]], %[[B0]]
117
- // FIXME- CHECK-DAG: %[[CMP0:.+]] = icmp sge i16 %[[A0]], %[[B0]]
118
- // FIXME- CHECK-DAG: %[[CMP1:.+]] = icmp uge i16 %[[A1]], %[[B1]]
119
- // FIXME- CHECK: %[[R:.+]] = select i1 %[[EQ]], i1 %[[CMP1]], i1 %[[CMP0]]
120
- // FIXME- CHECK: ret i1 %[[R]]
112
+ // CHECK-DAG: %[[EQ:.+]] = icmp eq i16 %[[A0]], %[[B0]]
113
+ // CHECK-DAG: %[[CMP0:.+]] = icmp sge i16 %[[A0]], %[[B0]]
114
+ // CHECK-DAG: %[[CMP1:.+]] = icmp uge i16 %[[A1]], %[[B1]]
115
+ // CHECK: %[[R:.+]] = select i1 %[[EQ]], i1 %[[CMP1]], i1 %[[CMP0]]
116
+ // CHECK: ret i1 %[[R]]
121
117
Ord :: cmp ( & a, & b) . is_ge ( )
122
118
}
0 commit comments