diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-10-05 20:09:16 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-10-05 20:09:16 +0000 |
commit | e4f9b09b5156b5bdd479a98ce28042d2a7623a9b (patch) | |
tree | 108f3d21d78cba28587a376274b9a04c389f32f1 /llvm/lib/CodeGen/FuncletLayout.cpp | |
parent | 46bc30472bd98182562446be98c4f27133a59a74 (diff) | |
download | bcm5719-llvm-e4f9b09b5156b5bdd479a98ce28042d2a7623a9b.tar.gz bcm5719-llvm-e4f9b09b5156b5bdd479a98ce28042d2a7623a9b.zip |
[WinEH] Update CATCHRET's operand to match its successor
The CATCHRET operand did not match the MachineFunction's CFG. This
mismatch happened because FrameLowering created a new MachineBasicBlock
and updated the CFG but forgot to update the CATCHRET operand.
Let's make sure this doesn't happen again by strengthing the funclet
membership analysis: it can now reason about the membership of all basic
blocks, not just those inside of funclets.
llvm-svn: 249344
Diffstat (limited to 'llvm/lib/CodeGen/FuncletLayout.cpp')
-rw-r--r-- | llvm/lib/CodeGen/FuncletLayout.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/FuncletLayout.cpp b/llvm/lib/CodeGen/FuncletLayout.cpp index 4307c1524ad..8b2f505ff02 100644 --- a/llvm/lib/CodeGen/FuncletLayout.cpp +++ b/llvm/lib/CodeGen/FuncletLayout.cpp @@ -42,8 +42,12 @@ bool FuncletLayout::runOnMachineFunction(MachineFunction &F) { if (FuncletMembership.empty()) return false; - F.sort([&](MachineBasicBlock &x, MachineBasicBlock &y) { - return FuncletMembership[&x] < FuncletMembership[&y]; + F.sort([&](MachineBasicBlock &X, MachineBasicBlock &Y) { + auto FuncletX = FuncletMembership.find(&X); + auto FuncletY = FuncletMembership.find(&Y); + assert(FuncletX != FuncletMembership.end()); + assert(FuncletY != FuncletMembership.end()); + return FuncletX->second < FuncletY->second; }); // Conservatively assume we changed something. |