Skip to content

Commit eb38edc

Browse files
authored
[RISCV,GISel] Add legalizer for G_ABS (#67577)
Lower G_ABS to support llvm.abs.* intrinsics.
1 parent ab89cfd commit eb38edc

File tree

3 files changed

+210
-0
lines changed

3 files changed

+210
-0
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
167167
.widenScalarToNextPow2(0);
168168
}
169169

170+
getActionDefinitionsBuilder(G_ABS).lower();
171+
170172
getLegacyLegalizerInfo().computeTables();
171173
}
172174

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -run-pass=legalizer %s -o - | FileCheck %s
3+
---
4+
name: abs_i8
5+
body: |
6+
bb.0.entry:
7+
; CHECK-LABEL: name: abs_i8
8+
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
9+
; CHECK-NEXT: [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 8
10+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 7
11+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
12+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[ASSERT_ZEXT]], [[C1]](s32)
13+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)
14+
; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[C]](s32)
15+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ASSERT_ZEXT]], [[ASHR1]]
16+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ADD]], [[ASHR1]]
17+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
18+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[XOR]], [[C2]]
19+
; CHECK-NEXT: $x10 = COPY [[AND]](s32)
20+
; CHECK-NEXT: PseudoRET implicit $x10
21+
%1:_(s32) = COPY $x10
22+
%2:_(s32) = G_ASSERT_ZEXT %1, 8
23+
%0:_(s8) = G_TRUNC %2(s32)
24+
%3:_(s8) = G_ABS %0
25+
%4:_(s32) = G_ZEXT %3(s8)
26+
$x10 = COPY %4(s32)
27+
PseudoRET implicit $x10
28+
...
29+
---
30+
name: abs_i16
31+
body: |
32+
bb.0.entry:
33+
; CHECK-LABEL: name: abs_i16
34+
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
35+
; CHECK-NEXT: [[ASSERT_SEXT:%[0-9]+]]:_(s32) = G_ASSERT_SEXT [[COPY]], 16
36+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15
37+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
38+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[ASSERT_SEXT]], [[C1]](s32)
39+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)
40+
; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[C]](s32)
41+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ASSERT_SEXT]], [[ASHR1]]
42+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ADD]], [[ASHR1]]
43+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
44+
; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[XOR]], [[C2]](s32)
45+
; CHECK-NEXT: [[ASHR2:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C2]](s32)
46+
; CHECK-NEXT: $x10 = COPY [[ASHR2]](s32)
47+
; CHECK-NEXT: PseudoRET implicit $x10
48+
%1:_(s32) = COPY $x10
49+
%2:_(s32) = G_ASSERT_SEXT %1, 16
50+
%0:_(s16) = G_TRUNC %2(s32)
51+
%3:_(s16) = G_ABS %0
52+
%4:_(s32) = G_SEXT %3(s16)
53+
$x10 = COPY %4(s32)
54+
PseudoRET implicit $x10
55+
...
56+
---
57+
name: abs_i32
58+
body: |
59+
bb.0.entry:
60+
; CHECK-LABEL: name: abs_i32
61+
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
62+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31
63+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[COPY]], [[C]](s32)
64+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[ASHR]]
65+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ADD]], [[ASHR]]
66+
; CHECK-NEXT: $x10 = COPY [[XOR]](s32)
67+
; CHECK-NEXT: PseudoRET implicit $x10
68+
%0:_(s32) = COPY $x10
69+
%1:_(s32) = G_ABS %0
70+
$x10 = COPY %1(s32)
71+
PseudoRET implicit $x10
72+
...
73+
---
74+
name: abs_i64
75+
body: |
76+
bb.0.entry:
77+
; CHECK-LABEL: name: abs_i64
78+
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
79+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
80+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31
81+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[COPY1]], [[C]](s32)
82+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 31
83+
; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[COPY1]], [[C1]](s32)
84+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[ASHR]]
85+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), [[ASHR]]
86+
; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY1]], [[ASHR1]]
87+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
88+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C2]]
89+
; CHECK-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ADD1]], [[AND]]
90+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[ADD]], [[ASHR]]
91+
; CHECK-NEXT: [[XOR1:%[0-9]+]]:_(s32) = G_XOR [[ADD2]], [[ASHR1]]
92+
; CHECK-NEXT: $x10 = COPY [[XOR]](s32)
93+
; CHECK-NEXT: $x11 = COPY [[XOR1]](s32)
94+
; CHECK-NEXT: PseudoRET implicit $x10, implicit $x11
95+
%1:_(s32) = COPY $x10
96+
%2:_(s32) = COPY $x11
97+
%0:_(s64) = G_MERGE_VALUES %1(s32), %2(s32)
98+
%3:_(s64) = G_ABS %0
99+
%4:_(s32), %5:_(s32) = G_UNMERGE_VALUES %3(s64)
100+
$x10 = COPY %4(s32)
101+
$x11 = COPY %5(s32)
102+
PseudoRET implicit $x10, implicit $x11
103+
...
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv64 -run-pass=legalizer %s -o - | FileCheck %s
3+
---
4+
name: abs_i8
5+
body: |
6+
bb.0.entry:
7+
; CHECK-LABEL: name: abs_i8
8+
; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
9+
; CHECK-NEXT: [[ASSERT_ZEXT:%[0-9]+]]:_(s64) = G_ASSERT_ZEXT [[COPY]], 8
10+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 7
11+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[ASSERT_ZEXT]](s64)
12+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
13+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC]], [[C1]](s32)
14+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)
15+
; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[C]](s32)
16+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[ASSERT_ZEXT]](s64)
17+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[TRUNC1]], [[ASHR1]]
18+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ADD]](s32)
19+
; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[ASHR1]](s32)
20+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[ANYEXT]], [[ANYEXT1]]
21+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 255
22+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[XOR]], [[C2]]
23+
; CHECK-NEXT: $x10 = COPY [[AND]](s64)
24+
; CHECK-NEXT: PseudoRET implicit $x10
25+
%1:_(s64) = COPY $x10
26+
%2:_(s64) = G_ASSERT_ZEXT %1, 8
27+
%0:_(s8) = G_TRUNC %2(s64)
28+
%3:_(s8) = G_ABS %0
29+
%4:_(s64) = G_ZEXT %3(s8)
30+
$x10 = COPY %4(s64)
31+
PseudoRET implicit $x10
32+
...
33+
---
34+
name: abs_i16
35+
body: |
36+
bb.0.entry:
37+
; CHECK-LABEL: name: abs_i16
38+
; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
39+
; CHECK-NEXT: [[ASSERT_SEXT:%[0-9]+]]:_(s64) = G_ASSERT_SEXT [[COPY]], 16
40+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15
41+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[ASSERT_SEXT]](s64)
42+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
43+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC]], [[C1]](s32)
44+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)
45+
; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[C]](s32)
46+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[ASSERT_SEXT]](s64)
47+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[TRUNC1]], [[ASHR1]]
48+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ADD]](s32)
49+
; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[ASHR1]](s32)
50+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[ANYEXT]], [[ANYEXT1]]
51+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 48
52+
; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s64) = G_SHL [[XOR]], [[C2]](s64)
53+
; CHECK-NEXT: [[ASHR2:%[0-9]+]]:_(s64) = G_ASHR [[SHL1]], [[C2]](s64)
54+
; CHECK-NEXT: $x10 = COPY [[ASHR2]](s64)
55+
; CHECK-NEXT: PseudoRET implicit $x10
56+
%1:_(s64) = COPY $x10
57+
%2:_(s64) = G_ASSERT_SEXT %1, 16
58+
%0:_(s16) = G_TRUNC %2(s64)
59+
%3:_(s16) = G_ABS %0
60+
%4:_(s64) = G_SEXT %3(s16)
61+
$x10 = COPY %4(s64)
62+
PseudoRET implicit $x10
63+
...
64+
---
65+
name: abs_i32
66+
body: |
67+
bb.0.entry:
68+
; CHECK-LABEL: name: abs_i32
69+
; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
70+
; CHECK-NEXT: [[ASSERT_SEXT:%[0-9]+]]:_(s64) = G_ASSERT_SEXT [[COPY]], 32
71+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[ASSERT_SEXT]](s64)
72+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31
73+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[TRUNC]], [[C]](s32)
74+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[TRUNC]], [[ASHR]]
75+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ADD]](s32)
76+
; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[ASHR]](s32)
77+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[ANYEXT]], [[ANYEXT1]]
78+
; CHECK-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[XOR]], 32
79+
; CHECK-NEXT: $x10 = COPY [[SEXT_INREG]](s64)
80+
; CHECK-NEXT: PseudoRET implicit $x10
81+
%1:_(s64) = COPY $x10
82+
%2:_(s64) = G_ASSERT_SEXT %1, 32
83+
%0:_(s32) = G_TRUNC %2(s64)
84+
%3:_(s32) = G_ABS %0
85+
%4:_(s64) = G_SEXT %3(s32)
86+
$x10 = COPY %4(s64)
87+
PseudoRET implicit $x10
88+
...
89+
---
90+
name: abs_i64
91+
body: |
92+
bb.0.entry:
93+
; CHECK-LABEL: name: abs_i64
94+
; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
95+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 63
96+
; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[COPY]], [[C]](s64)
97+
; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[ASHR]]
98+
; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[ADD]], [[ASHR]]
99+
; CHECK-NEXT: $x10 = COPY [[XOR]](s64)
100+
; CHECK-NEXT: PseudoRET implicit $x10
101+
%0:_(s64) = COPY $x10
102+
%1:_(s64) = G_ABS %0
103+
$x10 = COPY %1(s64)
104+
PseudoRET implicit $x10
105+
...

0 commit comments

Comments
 (0)