[PATCH] D140560: AMDGPU: Fix broken opaque pointer handling in printf pass

Matt Arsenault via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 10 09:47:13 PST 2023


arsenm added a comment.

In D140560#4040447 <https://reviews.llvm.org/D140560#4040447>, @nemanjai wrote:

> In D140560#4036217 <https://reviews.llvm.org/D140560#4036217>, @saghir wrote:
>
>> In D140560#4032567 <https://reviews.llvm.org/D140560#4032567>, @arsenm wrote:
>>
>>> In D140560#4031989 <https://reviews.llvm.org/D140560#4031989>, @arsenm wrote:
>>>
>>>> In D140560#4030857 <https://reviews.llvm.org/D140560#4030857>, @saghir wrote:
>>>>
>>>>> Hi, this seems to be causing our bots to fail. One example is https://lab.llvm.org/buildbot/#/builders/231/builds/6915. Can you please take a look? Thanks!
>>>>
>>>> I have a patch ready for this, need to write some more tests for it
>>>
>>> Try 40078a6b713730ffc164d4c0733d26352eb1e236 <https://reviews.llvm.org/rG40078a6b713730ffc164d4c0733d26352eb1e236>
>>
>> Thanks for taking a look. Your patch seems to have fixed the error seen before but it fails at a later check now:
>>
>>   /llvm/test/CodeGen/AMDGPU/opencl-printf.ll:1874:13: error: GCN-NEXT: expected string not found in input
>>   ; GCN-NEXT: store i32 1953722977, ptr addrspace(1) [[PRINTBUFFPTRCAST]], align 4
>>
>> Logs can be found here: https://lab.llvm.org/buildbot/#/builders/231/builds/7035/steps/6/logs/FAIL__LLVM__opencl-printf_ll
>
> Since this is still causing failures (i.e. `DataExtractor` does not reorder bytes for `getBytes()` as it does for `getU...()`), we can fix the problem as follows:
>
>   diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
>   index 18dbf5d..63a365e 100644
>   --- a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
>   +++ b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
>   @@ -435,19 +435,31 @@ bool AMDGPUPrintfRuntimeBindingImpl::lowerPrintfForGpu(Module &M) {
>                DataExtractor Extractor(S, /*IsLittleEndian=*/true, 8);
>                DataExtractor::Cursor Offset(0);
>                while (Offset && Offset.tell() < S.size()) {
>   -              StringRef ReadBytes = Extractor.getBytes(
>   -                  Offset, std::min(ReadSize, S.size() - Offset.tell()));
>   +              uint64_t ReadNow = std::min(ReadSize, S.size() - Offset.tell());
>   +              uint64_t ReadBytes = 0;
>   +              switch (ReadNow) {
>   +              default: llvm_unreachable("min(4, X) > 4?");
>   +              case 1:
>   +                ReadBytes = Extractor.getU8(Offset);
>   +                break;
>   +              case 2:
>   +                ReadBytes = Extractor.getU16(Offset);
>   +                break;
>   +              case 3:
>   +                ReadBytes = Extractor.getU24(Offset);
>   +                break;
>   +              case 4:
>   +                ReadBytes = Extractor.getU32(Offset);
>   +                break;
>   +              }
>    
>                  cantFail(Offset.takeError(),
>                           "failed to read bytes from constant array");
>    
>   -              APInt IntVal(8 * ReadBytes.size(), 0);
>   -              LoadIntFromMemory(
>   -                  IntVal, reinterpret_cast<const uint8_t *>(ReadBytes.data()),
>   -                  ReadBytes.size());
>   +              APInt IntVal(8 * ReadSize, ReadBytes);
>    
>                  // TODO: Should not bothering aligning up.
>   -              if (ReadBytes.size() < ReadSize)
>   +              if (ReadNow < ReadSize)
>                    IntVal = IntVal.zext(8 * ReadSize);
>    
>                  Type *IntTy = Type::getIntNTy(Ctx, IntVal.getBitWidth());
>
> @arsenm Would a fix similar to this be acceptable?

Yes, I was hoping to extend this to up to 16-bytes at a time but I guess I can figure that out then (we should probably just be emitting a memcpy/strcpy anyway)


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D140560/new/

https://reviews.llvm.org/D140560



More information about the llvm-commits mailing list