Skip to content

Commit 4491df2

Browse files
vladimirradosavljevicakiramenai
authored andcommitted
[EraVM] Add memref to instructions with constant pool operand
This will allow for MachineInstr queries to work properly (e.g. isDereferenceableInvariantLoad), so passes like MachineCSE, MachineSink, MachineLICM can optimize these instructions. Signed-off-by: Vladimir Radosavljevic <[email protected]>
1 parent 862a31e commit 4491df2

File tree

5 files changed

+35
-27
lines changed

5 files changed

+35
-27
lines changed

llvm/lib/Target/EraVM/EraVMISelDAGToDAG.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -358,14 +358,6 @@ void EraVMDAGToDAGISel::Select(SDNode *Node) {
358358
SDValue CP =
359359
CurDAG->getTargetConstantPool(cn->getConstantIntValue(), PtrVT);
360360
auto *lc = CurDAG->getMachineNode(EraVM::LOADCONST, DL, MVT::i256, CP);
361-
362-
// Annotate the Node with memory operand information so that MachineInstr
363-
// queries work properly.
364-
MachineFunction &MF = CurDAG->getMachineFunction();
365-
MachineMemOperand *MemOp =
366-
MF.getMachineMemOperand(MachinePointerInfo::getConstantPool(MF),
367-
MachineMemOperand::MOLoad, 32, Align(32));
368-
CurDAG->setNodeMemRefs(cast<MachineSDNode>(lc), {MemOp});
369361
ReplaceNode(Node, lc);
370362
return;
371363
}

llvm/lib/Target/EraVM/EraVMISelLowering.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,3 +1479,21 @@ void EraVMTargetLowering::AdjustInstrPostInstrSelection(MachineInstr &MI,
14791479
EraVM::out0Iterator(MI)->setIsEarlyClobber();
14801480
}
14811481
}
1482+
1483+
void EraVMTargetLowering::finalizeLowering(MachineFunction &MF) const {
1484+
for (MachineBasicBlock &MBB : MF) {
1485+
for (MachineInstr &MI : MBB) {
1486+
if (none_of(MI.operands(),
1487+
[](const MachineOperand &MO) { return MO.isCPI(); }))
1488+
continue;
1489+
1490+
// Annotate this instruction with memory operand information so that
1491+
// MachineInstr queries work properly.
1492+
MachineMemOperand *MemOp =
1493+
MF.getMachineMemOperand(MachinePointerInfo::getConstantPool(MF),
1494+
MachineMemOperand::MOLoad, 32, Align(32));
1495+
MI.addMemOperand(MF, MemOp);
1496+
}
1497+
}
1498+
TargetLoweringBase::finalizeLowering(MF);
1499+
}

llvm/lib/Target/EraVM/EraVMISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@ class EraVMTargetLowering : public TargetLowering {
205205
void AdjustInstrPostInstrSelection(MachineInstr &MI,
206206
SDNode *Node) const override;
207207

208+
void finalizeLowering(MachineFunction &MF) const override;
209+
208210
private:
209211
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
210212
bool isVarArg,

llvm/test/CodeGen/EraVM/machinesink-inst-with-cp-operand.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ declare void @use(i256)
99
define i256 @test(i256 %in, i1 %cond) {
1010
; CHECK-LABEL: test:
1111
; CHECK: ; %bb.0: ; %entry
12-
; CHECK-NEXT: and @CPI0_0[0], r1, r1
1312
; CHECK-NEXT: sub! r2, r0, r2
1413
; CHECK-NEXT: jump.eq @.BB0_2
1514
; CHECK-NEXT: ; %bb.1: ; %bb1
15+
; CHECK-NEXT: and @CPI0_0[0], r1, r1
1616
; CHECK-NEXT: near_call r0, @use, @DEFAULT_UNWIND
1717
; CHECK-NEXT: add r0, r0, r1
1818
; CHECK-NEXT: ret

llvm/test/CodeGen/EraVM/memintrinsics.ll

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,20 @@ define fastcc void @huge_copysize1(i256 addrspace(1)* %dest, i256 addrspace(1)*
3232
; CHECK: ; %bb.0:
3333
; CHECK-NEXT: add @CPI1_0[0], r1, r3
3434
; CHECK-NEXT: add r2, r0, r4
35-
; CHECK-NEXT: add r1, r0, r5
3635
; CHECK-NEXT: .BB1_1: ; %load-store-loop
3736
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
38-
; CHECK-NEXT: ld.1.inc r4, r6, r4
39-
; CHECK-NEXT: st.1.inc r5, r6, r5
40-
; CHECK-NEXT: sub! r5, r3, r6
37+
; CHECK-NEXT: ld.1.inc r4, r5, r4
38+
; CHECK-NEXT: st.1.inc r1, r5, r1
39+
; CHECK-NEXT: sub! r1, r3, r5
4140
; CHECK-NEXT: jump.ne @.BB1_1
4241
; CHECK-NEXT: ; %bb.2: ; %memcpy-split
43-
; CHECK-NEXT: add @CPI1_0[0], r1, r1
44-
; CHECK-NEXT: ld.1 r1, r3
45-
; CHECK-NEXT: and @CPI1_1[0], r3, r3
42+
; CHECK-NEXT: ld.1 r3, r1
43+
; CHECK-NEXT: and @CPI1_1[0], r1, r1
4644
; CHECK-NEXT: add @CPI1_0[0], r2, r2
4745
; CHECK-NEXT: ld.1 r2, r2
4846
; CHECK-NEXT: and @CPI1_2[0], r2, r2
49-
; CHECK-NEXT: or r2, r3, r2
50-
; CHECK-NEXT: st.1 r1, r2
47+
; CHECK-NEXT: or r2, r1, r1
48+
; CHECK-NEXT: st.1 r3, r1
5149
; CHECK-NEXT: ret
5250
call void @llvm.memcpy.p1i256.p1i256.i256(i256 addrspace(1)* %dest, i256 addrspace(1)* %src, i256 81129638414606681695789005144065, i1 false)
5351
ret void
@@ -58,22 +56,20 @@ define fastcc void @huge_copysize2(i256 addrspace(2)* %dest, i256 addrspace(2)*
5856
; CHECK: ; %bb.0:
5957
; CHECK-NEXT: add @CPI2_0[0], r1, r3
6058
; CHECK-NEXT: add r2, r0, r4
61-
; CHECK-NEXT: add r1, r0, r5
6259
; CHECK-NEXT: .BB2_1: ; %load-store-loop
6360
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
64-
; CHECK-NEXT: ld.2.inc r4, r6, r4
65-
; CHECK-NEXT: st.2.inc r5, r6, r5
66-
; CHECK-NEXT: sub! r5, r3, r6
61+
; CHECK-NEXT: ld.2.inc r4, r5, r4
62+
; CHECK-NEXT: st.2.inc r1, r5, r1
63+
; CHECK-NEXT: sub! r1, r3, r5
6764
; CHECK-NEXT: jump.ne @.BB2_1
6865
; CHECK-NEXT: ; %bb.2: ; %memcpy-split
69-
; CHECK-NEXT: add @CPI2_0[0], r1, r1
70-
; CHECK-NEXT: ld.2 r1, r3
71-
; CHECK-NEXT: and @CPI2_1[0], r3, r3
66+
; CHECK-NEXT: ld.2 r3, r1
67+
; CHECK-NEXT: and @CPI2_1[0], r1, r1
7268
; CHECK-NEXT: add @CPI2_0[0], r2, r2
7369
; CHECK-NEXT: ld.2 r2, r2
7470
; CHECK-NEXT: and @CPI2_2[0], r2, r2
75-
; CHECK-NEXT: or r2, r3, r2
76-
; CHECK-NEXT: st.2 r1, r2
71+
; CHECK-NEXT: or r2, r1, r1
72+
; CHECK-NEXT: st.2 r3, r1
7773
; CHECK-NEXT: ret
7874
call void @llvm.memcpy.p2i256.p2i256.i256(i256 addrspace(2)* %dest, i256 addrspace(2)* %src, i256 81129638414606681695789005144065, i1 false)
7975
ret void

0 commit comments

Comments
 (0)