1
- //@ revisions: DEBUG OPTIM
1
+ //@ revisions: DEBUG OPTIM riscv64-DEBUG riscv64-OPTIM
2
+ //@ [DEBUG] ignore-riscv64
2
3
//@ [DEBUG] compile-flags: -C opt-level=0
4
+ //@ [OPTIM] ignore-riscv64
3
5
//@ [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
4
14
//@ compile-flags: -C no-prepopulate-passes
5
15
6
16
#![ crate_type = "lib" ]
@@ -12,6 +22,8 @@ use std::intrinsics::three_way_compare;
12
22
// CHECK-LABEL: @signed_cmp
13
23
// DEBUG-SAME: (i16 %a, i16 %b)
14
24
// 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)
15
27
pub fn signed_cmp ( a : i16 , b : i16 ) -> std:: cmp:: Ordering {
16
28
// DEBUG: %[[GT:.+]] = icmp sgt i16 %a, %b
17
29
// DEBUG: %[[ZGT:.+]] = zext i1 %[[GT]] to i8
@@ -24,13 +36,27 @@ pub fn signed_cmp(a: i16, b: i16) -> std::cmp::Ordering {
24
36
// OPTIM: %[[CGE:.+]] = select i1 %[[NE]], i8 1, i8 0
25
37
// OPTIM: %[[CGEL:.+]] = select i1 %[[LT]], i8 -1, i8 %[[CGE]]
26
38
// 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]]
27
51
three_way_compare ( a, b)
28
52
}
29
53
30
54
#[ no_mangle]
31
55
// CHECK-LABEL: @unsigned_cmp
32
56
// DEBUG-SAME: (i16 %a, i16 %b)
33
57
// 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)
34
60
pub fn unsigned_cmp ( a : u16 , b : u16 ) -> std:: cmp:: Ordering {
35
61
// DEBUG: %[[GT:.+]] = icmp ugt i16 %a, %b
36
62
// DEBUG: %[[ZGT:.+]] = zext i1 %[[GT]] to i8
@@ -43,5 +69,17 @@ pub fn unsigned_cmp(a: u16, b: u16) -> std::cmp::Ordering {
43
69
// OPTIM: %[[CGE:.+]] = select i1 %[[NE]], i8 1, i8 0
44
70
// OPTIM: %[[CGEL:.+]] = select i1 %[[LT]], i8 -1, i8 %[[CGE]]
45
71
// 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]]
46
84
three_way_compare ( a, b)
47
85
}
0 commit comments