Skip to content

Commit 656fa52

Browse files
committed
Fix
1 parent 3b92cf2 commit 656fa52

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
@@ -2472,22 +2472,32 @@ bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
24722472
return false;
24732473
}
24742474

2475-
// symbol+offset
2476-
bool NVPTXDAGToDAGISel::SelectADDRsi_imp(
2477-
SDNode *OpNode, SDValue Addr, SDValue &Base, SDValue &Offset, MVT mvt) {
2475+
bool NVPTXDAGToDAGISel::FindRootAddressAndTotalOffset(
2476+
SDValue Addr, SDValue &Base, uint64_t &AccumulatedOffset) {
24782477
if (Addr.getOpcode() == ISD::ADD) {
24792478
if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
24802479
SDValue base = Addr.getOperand(0);
2481-
if (SelectDirectAddr(base, Base)) {
2482-
Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(OpNode),
2483-
mvt);
2480+
AccumulatedOffset += CN->getZExtValue();
2481+
if (SelectDirectAddr(base, Base))
24842482
return true;
2485-
}
2483+
return FindRootAddressAndTotalOffset(base, Base, AccumulatedOffset);
24862484
}
24872485
}
24882486
return false;
24892487
}
24902488

2489+
// symbol+offset
2490+
bool NVPTXDAGToDAGISel::SelectADDRsi_imp(SDNode *OpNode, SDValue Addr,
2491+
SDValue &Base, SDValue &Offset,
2492+
MVT mvt) {
2493+
uint64_t AccumulatedOffset = 0;
2494+
if (FindRootAddressAndTotalOffset(Addr, Base, AccumulatedOffset)) {
2495+
Offset = CurDAG->getTargetConstant(AccumulatedOffset, SDLoc(OpNode), mvt);
2496+
return true;
2497+
}
2498+
return false;
2499+
}
2500+
24912501
// symbol+offset
24922502
bool NVPTXDAGToDAGISel::SelectADDRsi(SDNode *OpNode, SDValue Addr,
24932503
SDValue &Base, SDValue &Offset) {

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ class LLVM_LIBRARY_VISIBILITY NVPTXDAGToDAGISel : public SelectionDAGISel {
9595
void SelectCpAsyncBulkTensorPrefetchCommon(SDNode *N, bool IsIm2Col = false);
9696
void SelectCpAsyncBulkTensorReduceCommon(SDNode *N, unsigned RedOp,
9797
bool IsIm2Col = false);
98+
bool FindRootAddressAndTotalOffset(SDValue Addr, SDValue &Base,
99+
uint64_t &AccumulatedOffset);
98100

99101
inline SDValue getI32Imm(unsigned Imm, const SDLoc &DL) {
100102
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)