Skip to content

Commit bf60144

Browse files
committed
Fix
1 parent 70e96dc commit bf60144

File tree

3 files changed

+63
-7
lines changed

3 files changed

+63
-7
lines changed

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2478,22 +2478,32 @@ bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
24782478
return false;
24792479
}
24802480

2481-
// symbol+offset
2482-
bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
2483-
SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
2481+
bool NVPTXDAGToDAGISel::FindRootAddressAndTotalOffset(
2482+
SDValue Addr, SDValue &Base, uint64_t &AccumulatedOffset) {
24842483
if (isAddLike(Addr)) {
24852484
if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
24862485
SDValue base = Addr.getOperand(0);
2487-
if (SelectDirectAddr(base, Base)) {
2488-
Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
2489-
mvt);
2486+
AccumulatedOffset += CN->getZExtValue();
2487+
if (SelectDirectAddr(base, Base))
24902488
return true;
2491-
}
2489+
return FindRootAddressAndTotalOffset(base, Base, AccumulatedOffset);
24922490
}
24932491
}
24942492
return false;
24952493
}
24962494

2495+
// symbol+offset
2496+
bool NVPTXDAGToDAGISel::SelectADDRsi_imp(SDNode *OpNode, SDValue Addr,
2497+
SDValue &Base, SDValue &Offset,
2498+
MVT mvt) {
2499+
uint64_t AccumulatedOffset = 0;
2500+
if (FindRootAddressAndTotalOffset(Addr, Base, AccumulatedOffset)) {
2501+
Offset = CurDAG->getTargetConstant(AccumulatedOffset, SDLoc(OpNode), mvt);
2502+
return true;
2503+
}
2504+
return false;
2505+
}
2506+
24972507
// symbol+offset
24982508
bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
24992509
SDValue &Base, SDValue &Offset) {

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h

Lines changed: 2 additions & 0 deletions
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);
Lines changed: 44 additions & 0 deletions
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)