1- //@ revisions: DEBUG OPTIM
1+ //@ revisions: DEBUG OPTIM riscv64-DEBUG riscv64-OPTIM
2+ //@ [DEBUG] ignore-riscv64
23//@ [DEBUG] compile-flags: -C opt-level=0
4+ //@ [OPTIM] ignore-riscv64
35//@ [OPTIM] compile-flags: -C opt-level=3
6+ //@ [riscv64-DEBUG] only-riscv64
7+ //@ [riscv64-DEBUG] compile-flags: --target riscv64gc-unknown-linux-gnu
8+ //@ [riscv64-DEBUG] compile-flags: -C opt-level=0
9+ //@ [riscv64-DEBUG] needs-llvm-components: riscv
10+ //@ [riscv64-OPTIM] only-riscv64
11+ //@ [riscv64-OPTIM] compile-flags: --target riscv64gc-unknown-linux-gnu
12+ //@ [riscv64-OPTIM] compile-flags: -C opt-level=3
13+ //@ [riscv64-OPTIM] needs-llvm-components: riscv
414//@ compile-flags: -C no-prepopulate-passes
515
616#![ crate_type = "lib" ]
@@ -12,6 +22,8 @@ use std::intrinsics::three_way_compare;
1222// CHECK-LABEL: @signed_cmp
1323// DEBUG-SAME: (i16 %a, i16 %b)
1424// OPTIM-SAME: (i16 noundef %a, i16 noundef %b)
25+ // riscv64-DEBUG-SAME: (i16 signext %a, i16 signext %b)
26+ // riscv64-OPTIM-SAME: (i16 noundef signext %a, i16 noundef signext %b)
1527pub fn signed_cmp ( a : i16 , b : i16 ) -> std:: cmp:: Ordering {
1628 // DEBUG: %[[GT:.+]] = icmp sgt i16 %a, %b
1729 // DEBUG: %[[ZGT:.+]] = zext i1 %[[GT]] to i8
@@ -24,13 +36,27 @@ pub fn signed_cmp(a: i16, b: i16) -> std::cmp::Ordering {
2436 // OPTIM: %[[CGE:.+]] = select i1 %[[NE]], i8 1, i8 0
2537 // OPTIM: %[[CGEL:.+]] = select i1 %[[LT]], i8 -1, i8 %[[CGE]]
2638 // OPTIM: ret i8 %[[CGEL]]
39+
40+ // riscv64-DEBUG: %[[GT:.+]] = icmp sgt i16 %a, %b
41+ // riscv64-DEBUG: %[[ZGT:.+]] = zext i1 %[[GT]] to i8
42+ // riscv64-DEBUG: %[[LT:.+]] = icmp slt i16 %a, %b
43+ // riscv64-DEBUG: %[[ZLT:.+]] = zext i1 %[[LT]] to i8
44+ // riscv64-DEBUG: %[[R:.+]] = sub nsw i8 %[[ZGT]], %[[ZLT]]
45+
46+ // riscv64-OPTIM: %[[LT:.+]] = icmp slt i16 %a, %b
47+ // riscv64-OPTIM: %[[NE:.+]] = icmp ne i16 %a, %b
48+ // riscv64-OPTIM: %[[CGE:.+]] = select i1 %[[NE]], i8 1, i8 0
49+ // riscv64-OPTIM: %[[CGEL:.+]] = select i1 %[[LT]], i8 -1, i8 %[[CGE]]
50+ // riscv64-OPTIM: ret i8 %[[CGEL]]
2751 three_way_compare ( a, b)
2852}
2953
3054#[ no_mangle]
3155// CHECK-LABEL: @unsigned_cmp
3256// DEBUG-SAME: (i16 %a, i16 %b)
3357// OPTIM-SAME: (i16 noundef %a, i16 noundef %b)
58+ // riscv64-DEBUG-SAME: (i16 zeroext %a, i16 zeroext %b)
59+ // riscv64-OPTIM-SAME: (i16 noundef zeroext %a, i16 noundef zeroext %b)
3460pub fn unsigned_cmp ( a : u16 , b : u16 ) -> std:: cmp:: Ordering {
3561 // DEBUG: %[[GT:.+]] = icmp ugt i16 %a, %b
3662 // DEBUG: %[[ZGT:.+]] = zext i1 %[[GT]] to i8
@@ -43,5 +69,17 @@ pub fn unsigned_cmp(a: u16, b: u16) -> std::cmp::Ordering {
4369 // OPTIM: %[[CGE:.+]] = select i1 %[[NE]], i8 1, i8 0
4470 // OPTIM: %[[CGEL:.+]] = select i1 %[[LT]], i8 -1, i8 %[[CGE]]
4571 // OPTIM: ret i8 %[[CGEL]]
72+
73+ // riscv64-DEBUG: %[[GT:.+]] = icmp ugt i16 %a, %b
74+ // riscv64-DEBUG: %[[ZGT:.+]] = zext i1 %[[GT]] to i8
75+ // riscv64-DEBUG: %[[LT:.+]] = icmp ult i16 %a, %b
76+ // riscv64-DEBUG: %[[ZLT:.+]] = zext i1 %[[LT]] to i8
77+ // riscv64-DEBUG: %[[R:.+]] = sub nsw i8 %[[ZGT]], %[[ZLT]]
78+
79+ // riscv64-OPTIM: %[[LT:.+]] = icmp ult i16 %a, %b
80+ // riscv64-OPTIM: %[[NE:.+]] = icmp ne i16 %a, %b
81+ // riscv64-OPTIM: %[[CGE:.+]] = select i1 %[[NE]], i8 1, i8 0
82+ // riscv64-OPTIM: %[[CGEL:.+]] = select i1 %[[LT]], i8 -1, i8 %[[CGE]]
83+ // riscv64-OPTIM: ret i8 %[[CGEL]]
4684 three_way_compare ( a, b)
4785}
0 commit comments