Skip to content

Commit 179a2e0

Browse files
authored
[RISCV][GISel] Legalize and select G_BRINDIRECT. (#73059)
1 parent 39faf13 commit 179a2e0

File tree

6 files changed

+180
-0
lines changed

6 files changed

+180
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,10 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
590590
MI.eraseFromParent();
591591
return true;
592592
}
593+
case TargetOpcode::G_BRINDIRECT:
594+
MI.setDesc(TII.get(RISCV::PseudoBRIND));
595+
MI.addOperand(MachineOperand::CreateImm(0));
596+
return constrainSelectedInstRegOperands(MI, TII, TRI, RBI);
593597
case TargetOpcode::G_SEXT_INREG:
594598
return selectSExtInreg(MI, MIB);
595599
case TargetOpcode::G_FRAME_INDEX: {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
181181

182182
getActionDefinitionsBuilder(G_BRJT).legalFor({{p0, sXLen}});
183183

184+
getActionDefinitionsBuilder(G_BRINDIRECT).legalFor({p0});
185+
184186
getActionDefinitionsBuilder(G_PHI)
185187
.legalFor({p0, sXLen})
186188
.widenScalarToNextPow2(0)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -run-pass=instruction-select -simplify-mir \
3+
# RUN: -verify-machineinstrs %s -o - | FileCheck -check-prefix=RV32I %s
4+
5+
---
6+
name: indirectbr
7+
legalized: true
8+
regBankSelected: true
9+
tracksRegLiveness: true
10+
body: |
11+
; RV32I-LABEL: name: indirectbr
12+
; RV32I: bb.0:
13+
; RV32I-NEXT: successors: %bb.1, %bb.2
14+
; RV32I-NEXT: liveins: $x10
15+
; RV32I-NEXT: {{ $}}
16+
; RV32I-NEXT: [[COPY:%[0-9]+]]:gprjalr = COPY $x10
17+
; RV32I-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 1
18+
; RV32I-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x0
19+
; RV32I-NEXT: PseudoBRIND [[COPY]], 0
20+
; RV32I-NEXT: {{ $}}
21+
; RV32I-NEXT: bb.1:
22+
; RV32I-NEXT: $x10 = COPY [[COPY1]]
23+
; RV32I-NEXT: PseudoRET implicit $x10
24+
; RV32I-NEXT: {{ $}}
25+
; RV32I-NEXT: bb.2:
26+
; RV32I-NEXT: $x10 = COPY [[ADDI]]
27+
; RV32I-NEXT: PseudoRET implicit $x10
28+
bb.1:
29+
successors: %bb.2, %bb.3
30+
liveins: $x10
31+
32+
%0:gprb(p0) = COPY $x10
33+
%1:gprb(s32) = G_CONSTANT i32 1
34+
%2:gprb(s32) = G_CONSTANT i32 0
35+
G_BRINDIRECT %0(p0)
36+
37+
bb.2:
38+
$x10 = COPY %2(s32)
39+
PseudoRET implicit $x10
40+
41+
bb.3:
42+
$x10 = COPY %1(s32)
43+
PseudoRET implicit $x10
44+
45+
...
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv64 -run-pass=instruction-select -simplify-mir \
3+
# RUN: -verify-machineinstrs %s -o - | FileCheck -check-prefix=RV64I %s
4+
5+
---
6+
name: indirectbr
7+
legalized: true
8+
regBankSelected: true
9+
tracksRegLiveness: true
10+
body: |
11+
; RV64I-LABEL: name: indirectbr
12+
; RV64I: bb.0:
13+
; RV64I-NEXT: successors: %bb.1, %bb.2
14+
; RV64I-NEXT: liveins: $x10
15+
; RV64I-NEXT: {{ $}}
16+
; RV64I-NEXT: [[COPY:%[0-9]+]]:gprjalr = COPY $x10
17+
; RV64I-NEXT: PseudoBRIND [[COPY]], 0
18+
; RV64I-NEXT: {{ $}}
19+
; RV64I-NEXT: bb.1:
20+
; RV64I-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x0
21+
; RV64I-NEXT: $x10 = COPY [[COPY1]]
22+
; RV64I-NEXT: PseudoRET implicit $x10
23+
; RV64I-NEXT: {{ $}}
24+
; RV64I-NEXT: bb.2:
25+
; RV64I-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 1
26+
; RV64I-NEXT: $x10 = COPY [[ADDI]]
27+
; RV64I-NEXT: PseudoRET implicit $x10
28+
bb.1:
29+
successors: %bb.2, %bb.3
30+
liveins: $x10
31+
32+
%0:gprb(p0) = COPY $x10
33+
G_BRINDIRECT %0(p0)
34+
35+
bb.2:
36+
%4:gprb(s64) = G_CONSTANT i64 0
37+
$x10 = COPY %4(s64)
38+
PseudoRET implicit $x10
39+
40+
bb.3:
41+
%2:gprb(s64) = G_CONSTANT i64 1
42+
$x10 = COPY %2(s64)
43+
PseudoRET implicit $x10
44+
45+
...
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -run-pass=legalizer %s -o - \
3+
# RUN: | FileCheck %s
4+
5+
---
6+
name: indirectbr
7+
body: |
8+
; CHECK-LABEL: name: indirectbr
9+
; CHECK: bb.0:
10+
; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
11+
; CHECK-NEXT: liveins: $x10
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
14+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
15+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
16+
; CHECK-NEXT: G_BRINDIRECT [[COPY]](p0)
17+
; CHECK-NEXT: {{ $}}
18+
; CHECK-NEXT: bb.1:
19+
; CHECK-NEXT: $x10 = COPY [[C1]](s32)
20+
; CHECK-NEXT: PseudoRET implicit $x10
21+
; CHECK-NEXT: {{ $}}
22+
; CHECK-NEXT: bb.2:
23+
; CHECK-NEXT: $x10 = COPY [[C]](s32)
24+
; CHECK-NEXT: PseudoRET implicit $x10
25+
bb.1:
26+
successors: %bb.2, %bb.3
27+
liveins: $x10
28+
29+
%0:_(p0) = COPY $x10
30+
%1:_(s32) = G_CONSTANT i32 1
31+
%2:_(s32) = G_CONSTANT i32 0
32+
G_BRINDIRECT %0(p0)
33+
34+
bb.2:
35+
$x10 = COPY %2(s32)
36+
PseudoRET implicit $x10
37+
38+
bb.3:
39+
$x10 = COPY %1(s32)
40+
PseudoRET implicit $x10
41+
42+
...
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv64 -run-pass=legalizer %s -o - \
3+
# RUN: | FileCheck %s
4+
5+
---
6+
name: indirectbr
7+
body: |
8+
; CHECK-LABEL: name: indirectbr
9+
; CHECK: bb.0:
10+
; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
11+
; CHECK-NEXT: liveins: $x10
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
14+
; CHECK-NEXT: G_BRINDIRECT [[COPY]](p0)
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: bb.1:
17+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
18+
; CHECK-NEXT: $x10 = COPY [[C]](s64)
19+
; CHECK-NEXT: PseudoRET implicit $x10
20+
; CHECK-NEXT: {{ $}}
21+
; CHECK-NEXT: bb.2:
22+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
23+
; CHECK-NEXT: $x10 = COPY [[C1]](s64)
24+
; CHECK-NEXT: PseudoRET implicit $x10
25+
bb.1:
26+
successors: %bb.2, %bb.3
27+
liveins: $x10
28+
29+
%0:_(p0) = COPY $x10
30+
G_BRINDIRECT %0(p0)
31+
32+
bb.2:
33+
%4:_(s64) = G_CONSTANT i64 0
34+
$x10 = COPY %4(s64)
35+
PseudoRET implicit $x10
36+
37+
bb.3:
38+
%2:_(s64) = G_CONSTANT i64 1
39+
$x10 = COPY %2(s64)
40+
PseudoRET implicit $x10
41+
42+
...

0 commit comments

Comments
 (0)