Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix i1 array global crash in NVPTXAsmPrinter. #92506

Merged
merged 1 commit into from
May 17, 2024
Merged

Conversation

jreiffers
Copy link
Contributor

See the test file. At head, this crashes with

assertion failed at llvm/lib/Support/APInt.cpp:492 in
uint64_t llvm::APInt::extractBitsAsZExtValue(unsigned int, unsigned int) const:
  bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
  "Illegal bit extraction"

See the test file. At head, this crashes with

```
assertion failed at llvm/lib/Support/APInt.cpp:492 in
uint64_t llvm::APInt::extractBitsAsZExtValue(unsigned int, unsigned int) const:
  bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
  "Illegal bit extraction"
```
@jreiffers jreiffers requested review from d0k and Artem-B May 17, 2024 07:24
@jreiffers jreiffers merged commit 698cf01 into llvm:main May 17, 2024
4 of 5 checks passed
@Artem-B
Copy link
Member

Artem-B commented May 17, 2024

Cal you provide more details on why exactly that assertion got triggered with i1 arrays?

@@ -1847,9 +1847,13 @@ void NVPTXAsmPrinter::bufferLEByte(const Constant *CPV, int Bytes,
auto AddIntToBuffer = [AggBuffer, Bytes](const APInt &Val) {
size_t NumBytes = (Val.getBitWidth() + 7) / 8;
SmallVector<unsigned char, 16> Buf(NumBytes);
for (unsigned I = 0; I < NumBytes; ++I) {
for (unsigned I = 0; I < NumBytes - 1; ++I) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could certainly use a comment or two about what's going on, because it's not obvious. At all.

Why exactly are we special casing the last byte?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's explained in the PR description, also look at the test. If the type's bitwidth is not a multiple of 8, the old code crashes.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR description only shows the expression for the failed assertion: bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth, but it was not clear which part of that assertion has failed.

The substance of the fix LGTM.

That said, If I ever need to look at this code in the future, I'm pretty sure I'll have to scratch my head, again, pondering what's going on here. Hence, my suggestion that a comment would be helpful. We already have way too many puzzles, we do not need more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. Sent a follow-up.

jreiffers added a commit to jreiffers/llvm-project that referenced this pull request May 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants