Skip to content

Commit b9000ab

Browse files
[RISCV][GISEL] Legalize G_PTRMASK
G_PTRMASK is custom legalized by using G_PTRTOINT on the pointer, using a G_AND to calculate the mask, and converted back to pointer using G_PTRTOINT.
1 parent 3311112 commit b9000ab

File tree

4 files changed

+74
-0
lines changed

4 files changed

+74
-0
lines changed

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
147147

148148
getActionDefinitionsBuilder(G_PTR_ADD).legalFor({{p0, sXLen}});
149149

150+
getActionDefinitionsBuilder(G_PTRMASK).customFor({{p0, sXLen}});
151+
150152
getActionDefinitionsBuilder(G_PTRTOINT)
151153
.legalFor({{sXLen, p0}})
152154
.clampScalar(0, sXLen, sXLen);
@@ -288,6 +290,25 @@ bool RISCVLegalizerInfo::legalizeShlAshrLshr(
288290
return true;
289291
}
290292

293+
bool RISCVLegalizerInfo::legalizePtrMask(MachineInstr &MI,
294+
MachineIRBuilder &MIRBuilder,
295+
GISelChangeObserver &Observer) const {
296+
assert(MI.getOpcode() == TargetOpcode::G_PTRMASK);
297+
298+
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
299+
Register Tmp1 =
300+
MRI.createGenericVirtualRegister(MRI.getType(MI.getOperand(2).getReg()));
301+
Register Tmp2 =
302+
MRI.createGenericVirtualRegister(MRI.getType(MI.getOperand(2).getReg()));
303+
MIRBuilder.buildPtrToInt(Tmp1, MI.getOperand(1).getReg());
304+
MIRBuilder.buildAnd(Tmp2, Tmp1, MI.getOperand(2).getReg());
305+
MIRBuilder.buildIntToPtr(MI.getOperand(0).getReg(), Tmp2);
306+
307+
Observer.erasingInstr(MI);
308+
MI.eraseFromParent();
309+
return true;
310+
}
311+
291312
bool RISCVLegalizerInfo::legalizeCustom(LegalizerHelper &Helper,
292313
MachineInstr &MI) const {
293314
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
@@ -309,6 +330,8 @@ bool RISCVLegalizerInfo::legalizeCustom(LegalizerHelper &Helper,
309330
return Helper.lower(MI, 0, /* Unused hint type */ LLT()) ==
310331
LegalizerHelper::Legalized;
311332
}
333+
case TargetOpcode::G_PTRMASK:
334+
return legalizePtrMask(MI, MIRBuilder, Observer);
312335
}
313336

314337
llvm_unreachable("expected switch to return");

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class RISCVLegalizerInfo : public LegalizerInfo {
3131
private:
3232
bool legalizeShlAshrLshr(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
3333
GISelChangeObserver &Observer) const;
34+
35+
bool legalizePtrMask(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
36+
GISelChangeObserver &Observer) const;
3437
};
3538
} // end namespace llvm
3639
#endif
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s
3+
4+
---
5+
name: ptrmask_p0_s32
6+
body: |
7+
bb.0:
8+
liveins: $x10, $x11
9+
; CHECK-LABEL: name: ptrmask_p0_s32
10+
; CHECK: liveins: $x10, $x11
11+
; CHECK-NEXT: {{ $}}
12+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
13+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
14+
; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY]](p0)
15+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[PTRTOINT]], [[COPY1]]
16+
; CHECK-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[AND]](s32)
17+
; CHECK-NEXT: $x10 = COPY [[INTTOPTR]](p0)
18+
; CHECK-NEXT: PseudoRET implicit $x10
19+
%0:_(p0) = COPY $x10
20+
%1:_(s32) = COPY $x11
21+
%2:_(p0) = G_PTRMASK %0(p0), %1(s32)
22+
$x10 = COPY %2(p0)
23+
PseudoRET implicit $x10
24+
...
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv64 -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s
3+
4+
---
5+
name: ptrmask_p0_s64
6+
body: |
7+
bb.0:
8+
liveins: $x10, $x11
9+
; CHECK-LABEL: name: ptrmask_p0_s64
10+
; CHECK: liveins: $x10, $x11
11+
; CHECK-NEXT: {{ $}}
12+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
13+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
14+
; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[COPY]](p0)
15+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[PTRTOINT]], [[COPY1]]
16+
; CHECK-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[AND]](s64)
17+
; CHECK-NEXT: $x10 = COPY [[INTTOPTR]](p0)
18+
; CHECK-NEXT: PseudoRET implicit $x10
19+
%0:_(p0) = COPY $x10
20+
%1:_(s64) = COPY $x11
21+
%2:_(p0) = G_PTRMASK %0(p0), %1(s64)
22+
$x10 = COPY %2(p0)
23+
PseudoRET implicit $x10
24+
...

0 commit comments

Comments
 (0)