Make SwitchInst::removeCase() more efficient.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124659 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jay Foad 2011-02-01 09:22:34 +00:00
parent f9e4a986c0
commit 0faa60938a
2 changed files with 6 additions and 9 deletions

View File

@ -2247,7 +2247,8 @@ public:
/// removeCase - This method removes the specified successor from the switch
/// instruction. Note that this cannot be used to remove the default
/// destination (successor #0).
/// destination (successor #0). Also note that this operation may reorder the
/// remaining cases at index idx and above.
///
void removeCase(unsigned idx);

View File

@ -3009,14 +3009,10 @@ void SwitchInst::removeCase(unsigned idx) {
unsigned NumOps = getNumOperands();
Use *OL = OperandList;
// Move everything after this operand down.
//
// FIXME: we could just swap with the end of the list, then erase. However,
// client might not expect this to happen. The code as it is thrashes the
// use/def lists, which is kinda lame.
for (unsigned i = (idx+1)*2; i != NumOps; i += 2) {
OL[i-2] = OL[i];
OL[i-2+1] = OL[i+1];
// Overwrite this case with the end of the list.
if ((idx + 1) * 2 != NumOps) {
OL[idx * 2] = OL[NumOps - 2];
OL[idx * 2 + 1] = OL[NumOps - 1];
}
// Nuke the last value.