Skip to content

Commit c3dc149

Browse files
mmereckiigcbot
authored andcommitted
Fix sampler immediate offsets programming
This PR enables the use of sampelr messaegs with programmable offsets when immediates offset values are outside of the [-8, 7] range.
1 parent c1cf2c8 commit c3dc149

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

IGC/Compiler/TranslateToProgrammableOffsetsPass.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ struct TranslateIntrinsic : TranslateIntrinsicImpl<TTranslateIntrinsic>
154154
{
155155
using ImplType = TranslateIntrinsicImpl<TTranslateIntrinsic>;
156156

157+
static bool IsValidImmediateOffset(llvm::Value* offset)
158+
{
159+
constexpr int64_t cMinImmediateOffset = -8;
160+
constexpr int64_t cMaxImmediateOffset = 7;
161+
llvm::ConstantInt* imm = llvm::dyn_cast<llvm::ConstantInt>(offset);
162+
if (imm &&
163+
imm->getSExtValue() >= cMinImmediateOffset &&
164+
imm->getSExtValue() <= cMaxImmediateOffset)
165+
{
166+
return true;
167+
}
168+
return false;
169+
}
170+
157171
template<class SampleOrGatherInstrinsic>
158172
static bool IsApplicable(SampleOrGatherInstrinsic* sampleOrGatherIntr)
159173
{
@@ -163,9 +177,9 @@ struct TranslateIntrinsic : TranslateIntrinsicImpl<TTranslateIntrinsic>
163177
llvm::Value* offsetR = sampleOrGatherIntr->getOperand(immOffsetSourceIndex + 2);
164178

165179
bool applicable =
166-
!llvm::isa<llvm::Constant>(offsetU) ||
167-
!llvm::isa<llvm::Constant>(offsetV) ||
168-
!llvm::isa<llvm::Constant>(offsetR);
180+
!IsValidImmediateOffset(offsetU) ||
181+
!IsValidImmediateOffset(offsetV) ||
182+
!IsValidImmediateOffset(offsetR);
169183

170184
applicable &= IsApplicableDerived<ImplType>(sampleOrGatherIntr);
171185

0 commit comments

Comments
 (0)