Skip to content

Commit e0ea9fd

Browse files
authored
[RISCV][GISel] Lower G_SCMP and G_UCMP. (#119112)
Codegen is not optimal for RISC-V yet. We should port the (sub (setgt X, Y), (setlt X, Y)) lowering from SelectionDAG.
1 parent 26760c7 commit e0ea9fd

File tree

6 files changed

+801
-4
lines changed

6 files changed

+801
-4
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
482482
.minScalar(ST.hasStdExtZbb(), 0, sXLen)
483483
.lower();
484484

485+
getActionDefinitionsBuilder({G_SCMP, G_UCMP}).lower();
486+
485487
getActionDefinitionsBuilder(G_FRAME_INDEX).legalFor({p0});
486488

487489
getActionDefinitionsBuilder({G_MEMCPY, G_MEMMOVE, G_MEMSET}).libcall();

llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,11 +364,12 @@
364364
# DEBUG-NEXT: .. the first uncovered type index: 2, OK
365365
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
366366
# DEBUG-NEXT: G_SCMP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
367-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
368-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
367+
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
368+
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
369369
# DEBUG-NEXT: G_UCMP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
370-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
371-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
370+
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
371+
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
372+
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
372373
# DEBUG-NEXT: G_SELECT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
373374
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
374375
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=riscv32 -run-pass=legalizer %s -o - | FileCheck %s
3+
4+
---
5+
name: test_ucmp_i32
6+
body: |
7+
bb.1:
8+
liveins: $x10, $x11
9+
10+
; CHECK-LABEL: name: test_ucmp_i32
11+
; CHECK: liveins: $x10, $x11
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
14+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
15+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
16+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
17+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(sgt), [[COPY]](s32), [[COPY1]]
18+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s32), [[C]], [[C1]]
19+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1
20+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(slt), [[COPY]](s32), [[COPY1]]
21+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ICMP1]](s32), [[C2]], [[SELECT]]
22+
; CHECK-NEXT: $x10 = COPY [[SELECT1]](s32)
23+
; CHECK-NEXT: PseudoRET implicit $x10
24+
%0:_(s32) = COPY $x10
25+
%1:_(s32) = COPY $x11
26+
%2:_(s32) = G_SCMP %0(s32), %1
27+
$x10 = COPY %2(s32)
28+
PseudoRET implicit $x10
29+
30+
...
31+
---
32+
name: test_scmp_i32
33+
alignment: 4
34+
body: |
35+
bb.1:
36+
liveins: $x10, $x11
37+
38+
; CHECK-LABEL: name: test_scmp_i32
39+
; CHECK: liveins: $x10, $x11
40+
; CHECK-NEXT: {{ $}}
41+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $x10
42+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
43+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
44+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
45+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(sgt), [[COPY]](s32), [[COPY1]]
46+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s32), [[C]], [[C1]]
47+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1
48+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(slt), [[COPY]](s32), [[COPY1]]
49+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ICMP1]](s32), [[C2]], [[SELECT]]
50+
; CHECK-NEXT: $x10 = COPY [[SELECT1]](s32)
51+
; CHECK-NEXT: PseudoRET implicit $x10
52+
%0:_(s32) = COPY $x10
53+
%1:_(s32) = COPY $x11
54+
%2:_(s32) = G_SCMP %0(s32), %1
55+
$x10 = COPY %2(s32)
56+
PseudoRET implicit $x10
57+
58+
...
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=riscv64 -run-pass=legalizer %s -o - | FileCheck %s
3+
4+
---
5+
name: test_ucmp_i32
6+
body: |
7+
bb.1:
8+
liveins: $x10, $x11
9+
10+
; CHECK-LABEL: name: test_ucmp_i32
11+
; CHECK: liveins: $x10, $x11
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
14+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
15+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
16+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)
17+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
18+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[C1]](s64)
19+
; CHECK-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY]], 32
20+
; CHECK-NEXT: [[SEXT_INREG1:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY1]], 32
21+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(sgt), [[SEXT_INREG]](s64), [[SEXT_INREG1]]
22+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s64), [[TRUNC]], [[TRUNC1]]
23+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1
24+
; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[C2]](s64)
25+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(slt), [[SEXT_INREG]](s64), [[SEXT_INREG1]]
26+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ICMP1]](s64), [[TRUNC2]], [[SELECT]]
27+
; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[SELECT1]](s32)
28+
; CHECK-NEXT: $x10 = COPY [[SEXT]](s64)
29+
; CHECK-NEXT: PseudoRET implicit $x10
30+
%2:_(s64) = COPY $x10
31+
%0:_(s32) = G_TRUNC %2(s64)
32+
%3:_(s64) = COPY $x11
33+
%1:_(s32) = G_TRUNC %3(s64)
34+
%4:_(s32) = G_SCMP %0(s32), %1
35+
%5:_(s64) = G_SEXT %4(s32)
36+
$x10 = COPY %5(s64)
37+
PseudoRET implicit $x10
38+
39+
...
40+
---
41+
name: test_scmp_i32
42+
body: |
43+
bb.1:
44+
liveins: $x10, $x11
45+
46+
; CHECK-LABEL: name: test_scmp_i32
47+
; CHECK: liveins: $x10, $x11
48+
; CHECK-NEXT: {{ $}}
49+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
50+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
51+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
52+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)
53+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
54+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[C1]](s64)
55+
; CHECK-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY]], 32
56+
; CHECK-NEXT: [[SEXT_INREG1:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY1]], 32
57+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(sgt), [[SEXT_INREG]](s64), [[SEXT_INREG1]]
58+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s64), [[TRUNC]], [[TRUNC1]]
59+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1
60+
; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[C2]](s64)
61+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s64) = G_ICMP intpred(slt), [[SEXT_INREG]](s64), [[SEXT_INREG1]]
62+
; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ICMP1]](s64), [[TRUNC2]], [[SELECT]]
63+
; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[SELECT1]](s32)
64+
; CHECK-NEXT: $x10 = COPY [[SEXT]](s64)
65+
; CHECK-NEXT: PseudoRET implicit $x10
66+
%2:_(s64) = COPY $x10
67+
%0:_(s32) = G_TRUNC %2(s64)
68+
%3:_(s64) = COPY $x11
69+
%1:_(s32) = G_TRUNC %3(s64)
70+
%4:_(s32) = G_SCMP %0(s32), %1
71+
%5:_(s64) = G_SEXT %4(s32)
72+
$x10 = COPY %5(s64)
73+
PseudoRET implicit $x10
74+
75+
...

0 commit comments

Comments
 (0)