-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[ARM64] [Windows] Mark block address as taken when expanding catchrets #109252
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
Conversation
@llvm/pr-subscribers-backend-aarch64 Author: Maurice Heumann (momo5502) ChangesThis fixes issue #109250 The issue happens during the ReplaceUsesOfBlockWith only replaces uses in the terminator. However, Marking the block addresss as taken prevents the replacement of the block, without also replacing non-terminator uses. Full diff: https://github.com/llvm/llvm-project/pull/109252.diff 1 Files Affected:
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index 3b38a5f78dee51..32bc0e7d0d6475 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -1994,6 +1994,7 @@ bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
.addReg(AArch64::X0)
.addMBB(TargetMBB)
.addImm(0);
+ TargetMBB->setMachineBlockAddressTaken();
return true;
}
|
Code change makes sense; please add a testcase. |
I added the sample from the issue as a test case to assert the issue does not occur anymore. I hope this is fine. |
Is the test fine like this? |
This fixes issue llvm#109250 The issue happens during the `MachineBlockPlacement` pass. The block, whose address was previously not taken, is deemed redundant by the pass and subsequently replaced using `MachineBasicBlock::ReplaceUsesOfBlockWith` in `BranchFolding`. ReplaceUsesOfBlockWith only replaces uses in the terminator. However, `expandPostRAPseudo` introduces new block uses when expanding catchrets. These uses do not get replaced, which results in undefined label errors later on. Marking the block addresss as taken prevents the replacement of the block, without also replacing non-terminator uses.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Thanks, would you mind merging it for me, please? |
This fixes issue #109250
The issue happens during the
MachineBlockPlacement
pass. The block, whose address was previously not taken, is deemed redundant by the pass and subsequently replaced usingMachineBasicBlock::ReplaceUsesOfBlockWith
inBranchFolding
.ReplaceUsesOfBlockWith only replaces uses in the terminator. However,
expandPostRAPseudo
introduces new block uses when expanding catchrets. These uses do not get replaced, which results in undefined label errors later on.Marking the block addresss as taken prevents the replacement of the block, without also replacing non-terminator uses.