Skip to content

Commit a6ae559

Browse files
pratikasharigcbot
authored andcommitted
Add appropriate predicate to mov when sample is split
When we split a predicated sample, we create 2 predicated samples and copies from sample write back message to original variable. The copies must use same predicate as the sample. Otherwise semantics are incorrect if such a split occurs in a loop.
1 parent d26e243 commit a6ae559

File tree

3 files changed

+8
-5
lines changed

3 files changed

+8
-5
lines changed

visa/BuildIR.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1759,7 +1759,8 @@ class IR_Builder {
17591759
// emask is InstOption
17601760
void Copy_SrcRegRegion_To_Payload(G4_Declare *payload, unsigned int &regOff,
17611761
G4_SrcRegRegion *src, G4_ExecSize execSize,
1762-
uint32_t emask);
1762+
uint32_t emask,
1763+
G4_Predicate *pred = nullptr);
17631764
unsigned int getByteOffsetSrcRegion(G4_SrcRegRegion *srcRegion);
17641765

17651766
// only used in TranslateSend3D, maybe consider moving there if no

visa/VisaToG4/TranslateMisc.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,13 +391,15 @@ void IR_Builder::Copy_SrcRegRegion_To_Payload(G4_Declare *payload,
391391
unsigned int &regOff,
392392
G4_SrcRegRegion *src,
393393
G4_ExecSize execSize,
394-
uint32_t emask) {
394+
uint32_t emask,
395+
G4_Predicate* pred) {
395396
auto payloadDstRgn = createDst(payload->getRegVar(), (short)regOff, 0, 1,
396397
payload->getElemType());
397398

398399
G4_SrcRegRegion *srcRgn = createSrcRegRegion(*src);
399400
srcRgn->setType(*this, payload->getElemType());
400-
createMov(execSize, payloadDstRgn, srcRgn, emask, true);
401+
createMov(duplicateOperand(pred), execSize, payloadDstRgn, srcRgn, emask,
402+
true);
401403
if (TypeSize(payload->getElemType()) == 2) {
402404
// for half float each source occupies 1 GRF regardless of execution size
403405
regOff++;

visa/VisaToG4/TranslateSend3D.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,7 +2159,7 @@ int IR_Builder::splitSampleInst(
21592159
createMov(execSize, dst, tmpSrcPnt, MovInstOpt, true);
21602160
} else {
21612161
Copy_SrcRegRegion_To_Payload(originalDstDcl, regOff, tmpSrcPnt,
2162-
execSize, MovInstOpt);
2162+
execSize, MovInstOpt, pred);
21632163
}
21642164
}
21652165
}
@@ -2199,7 +2199,7 @@ int IR_Builder::splitSampleInst(
21992199
createMov(execSize, dst, tmpSrcPnt, MovInstOpt, true);
22002200
} else {
22012201
Copy_SrcRegRegion_To_Payload(originalDstDcl, regOff, tmpSrcPnt,
2202-
execSize, MovInstOpt);
2202+
execSize, MovInstOpt, pred);
22032203
}
22042204
}
22052205
}

0 commit comments

Comments
 (0)