Skip to content

Commit 4b2aa88

Browse files
committed
Fix
1 parent 0f776f1 commit 4b2aa88

File tree

3 files changed

+63
-7
lines changed

3 files changed

+63
-7
lines changed

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -3880,22 +3880,32 @@ bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
38803880
return false;
38813881
}
38823882

3883-
// symbol+offset
3884-
bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
3885-
SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
3883+
bool NVPTXDAGToDAGISel::FindRootAddressAndTotalOffset(
3884+
SDValue Addr, SDValue &Base, uint64_t &AccumulatedOffset) {
38863885
if (Addr.getOpcode() == ISD::ADD) {
38873886
if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
38883887
SDValue base = Addr.getOperand(0);
3889-
if (SelectDirectAddr(base, Base)) {
3890-
Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
3891-
mvt);
3888+
AccumulatedOffset += CN->getZExtValue();
3889+
if (SelectDirectAddr(base, Base))
38923890
return true;
3893-
}
3891+
return FindRootAddressAndTotalOffset(base, Base, AccumulatedOffset);
38943892
}
38953893
}
38963894
return false;
38973895
}
38983896

3897+
// symbol+offset
3898+
bool NVPTXDAGToDAGISel::SelectADDRsi_imp(SDNode *OpNode, SDValue Addr,
3899+
SDValue &Base, SDValue &Offset,
3900+
MVT mvt) {
3901+
uint64_t AccumulatedOffset = 0;
3902+
if (FindRootAddressAndTotalOffset(Addr, Base, AccumulatedOffset)) {
3903+
Offset = CurDAG->getTargetConstant(AccumulatedOffset, SDLoc(OpNode), mvt);
3904+
return true;
3905+
}
3906+
return false;
3907+
}
3908+
38993909
// symbol+offset
39003910
bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
39013911
SDValue &Base, SDValue &Offset) {

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h

+2
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ class LLVM_LIBRARY_VISIBILITY NVPTXDAGToDAGISel : public SelectionDAGISel {
9797
void SelectCpAsyncBulkTensorPrefetchCommon(SDNode *N, bool IsIm2Col = false);
9898
void SelectCpAsyncBulkTensorReduceCommon(SDNode *N, unsigned RedOp,
9999
bool IsIm2Col = false);
100+
bool FindRootAddressAndTotalOffset(SDValue Addr, SDValue &Base,
101+
uint64_t &AccumulatedOffset);
100102

101103
inline SDValue getI32Imm(unsigned Imm, const SDLoc &DL) {
102104
return CurDAG->getTargetConstant(Imm, DL, MVT::i32);

llvm/test/CodeGen/NVPTX/param-add.ll

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
; RUN: llc < %s -march=nvptx64 --debug-counter=dagcombine=0 | FileCheck %s
2+
; RUN: %if ptxas %{ llc < %s -march=nvptx64 | %ptxas-verify %}
3+
4+
%struct.8float = type <{ [8 x float] }>
5+
6+
declare i32 @callee(%struct.8float %a)
7+
8+
define i32 @test(%struct.8float alignstack(32) %data) {
9+
;CHECK-NOT: add.
10+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0];
11+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+1];
12+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+2];
13+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+3];
14+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+4];
15+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+5];
16+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+6];
17+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+7];
18+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+8];
19+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+9];
20+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+10];
21+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+11];
22+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+12];
23+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+13];
24+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+14];
25+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+15];
26+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+16];
27+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+17];
28+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+18];
29+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+19];
30+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+20];
31+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+21];
32+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+22];
33+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+23];
34+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+24];
35+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+26];
36+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+27];
37+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+28];
38+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+29];
39+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+30];
40+
;CHECK-DAG: ld.param.u8 %r{{.*}}, [test_param_0+31];
41+
42+
%1 = call i32 @callee(%struct.8float %data)
43+
ret i32 %1
44+
}

0 commit comments

Comments
 (0)