[llvm] [DirectX] add support for i64 buffer load/stores (PR #145047)
Sarah Spall via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 20 08:43:30 PDT 2025
================
@@ -570,22 +575,54 @@ static bool expandTypedBufferLoadIntrinsic(CallInst *Orig) {
ExtractElements.push_back(
Builder.CreateExtractElement(Extract, Builder.getInt32(I)));
- // combine into double(s)
+ // combine into double(s) or int64(s)
Value *Result = PoisonValue::get(BufferTy);
for (unsigned I = 0; I < ExtractNum; I += 2) {
- Value *Dbl =
- Builder.CreateIntrinsic(Builder.getDoubleTy(), Intrinsic::dx_asdouble,
- {ExtractElements[I], ExtractElements[I + 1]});
+ Value *Combined = nullptr;
+ if (IsDouble) {
+ // For doubles, use dx_asdouble intrinsic
+ Combined =
+ Builder.CreateIntrinsic(Builder.getDoubleTy(), Intrinsic::dx_asdouble,
+ {ExtractElements[I], ExtractElements[I + 1]});
+ } else {
+ // For int64, manually combine two int32s
+ // First, zero-extend both values to i64
+ Value *Lo = Builder.CreateZExt(ExtractElements[I], Builder.getInt64Ty());
+ Value *Hi =
+ Builder.CreateZExt(ExtractElements[I + 1], Builder.getInt64Ty());
+ // Shift the high bits left by 32 bits
+ Value *ShiftedHi = Builder.CreateShl(Hi, Builder.getInt64(32));
+ // OR the high and low bits together
+ Combined = Builder.CreateOr(Lo, ShiftedHi);
+ }
+
if (ExtractNum == 4)
- Result =
- Builder.CreateInsertElement(Result, Dbl, Builder.getInt32(I / 2));
+ Result = Builder.CreateInsertElement(Result, Combined,
+ Builder.getInt32(I / 2));
else
- Result = Dbl;
+ Result = Combined;
}
Value *CheckBit = nullptr;
for (User *U : make_early_inc_range(Orig->users())) {
- auto *EVI = cast<ExtractValueInst>(U);
+ if (auto *Ret = dyn_cast<ReturnInst>(U)) {
+ // For return instructions, we need to handle the case where the function
+ // is directly returning the result of the call
+ Type *RetTy = Ret->getFunction()->getReturnType();
+ Value *StructRet = PoisonValue::get(RetTy);
+ StructRet = Builder.CreateInsertValue(StructRet, Result, {0});
+ Value *CheckBitForRet = Builder.CreateExtractValue(Load, {1});
----------------
spall wrote:
I don't think you can do this. My understanding is this will fail the validator because you have unconditionally accessed the check bit.
https://github.com/llvm/llvm-project/pull/139996#discussion_r2110225269
Also see the other note on anonymous struct types.
https://github.com/llvm/llvm-project/pull/145047
More information about the llvm-commits
mailing list