11//@ compile-flags: -C opt-level=1 -Z merge-functions=disabled
22//@ only-x86_64
3+ //@ min-llvm-version: 20
34
45#![ crate_type = "lib" ]
56
@@ -65,12 +66,7 @@ pub fn check_ge_direct(a: TwoTuple, b: TwoTuple) -> bool {
6566}
6667
6768//
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 🎉
7470//
7571
7672// CHECK-LABEL: @check_lt_via_cmp
@@ -89,34 +85,34 @@ pub fn check_lt_via_cmp(a: TwoTuple, b: TwoTuple) -> bool {
8985// CHECK-SAME: (i16 noundef %[[A0:.+]], i16 noundef %[[A1:.+]], i16 noundef %[[B0:.+]], i16 noundef %[[B1:.+]])
9086#[ no_mangle]
9187pub 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]]
9793 Ord :: cmp ( & a, & b) . is_le ( )
9894}
9995
10096// CHECK-LABEL: @check_gt_via_cmp
10197// CHECK-SAME: (i16 noundef %[[A0:.+]], i16 noundef %[[A1:.+]], i16 noundef %[[B0:.+]], i16 noundef %[[B1:.+]])
10298#[ no_mangle]
10399pub 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]]
109105 Ord :: cmp ( & a, & b) . is_gt ( )
110106}
111107
112108// CHECK-LABEL: @check_ge_via_cmp
113109// CHECK-SAME: (i16 noundef %[[A0:.+]], i16 noundef %[[A1:.+]], i16 noundef %[[B0:.+]], i16 noundef %[[B1:.+]])
114110#[ no_mangle]
115111pub 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]]
121117 Ord :: cmp ( & a, & b) . is_ge ( )
122118}
0 commit comments