diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-03-14 20:44:01 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-03-14 20:44:01 +0000 |
commit | c17ba8a28d2f83dd320745c0c9994464845ac990 (patch) | |
tree | c57ae111d72c5e1250c587cbc83c40127fb27990 | |
parent | 7e526e754481d66a9849e49fb2be19772db91529 (diff) | |
download | external_llvm-c17ba8a28d2f83dd320745c0c9994464845ac990.zip external_llvm-c17ba8a28d2f83dd320745c0c9994464845ac990.tar.gz external_llvm-c17ba8a28d2f83dd320745c0c9994464845ac990.tar.bz2 |
Fix PR2138. Apparently any modification to a std::multimap (including remove entries for a different key) can invalidate multimap iterators.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48371 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/VirtRegMap.cpp | 10 | ||||
-rw-r--r-- | test/CodeGen/X86/2008-03-14-SpillerCrash.ll | 48 |
2 files changed, 56 insertions, 2 deletions
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp index 8c6934a..b094412 100644 --- a/lib/CodeGen/VirtRegMap.cpp +++ b/lib/CodeGen/VirtRegMap.cpp @@ -865,12 +865,15 @@ bool LocalSpiller::PrepForUnfoldOpti(MachineBasicBlock &MBB, unsigned UnfoldVR = 0; int FoldedSS = VirtRegMap::NO_STACK_SLOT; VirtRegMap::MI2VirtMapTy::const_iterator I, End; - for (tie(I, End) = VRM.getFoldedVirts(&MI); I != End; ++I) { + for (tie(I, End) = VRM.getFoldedVirts(&MI); I != End; ) { // Only transform a MI that folds a single register. if (UnfoldedOpc) return false; UnfoldVR = I->second.first; VirtRegMap::ModRef MR = I->second.second; + // MI2VirtMap be can updated which invalidate the iterator. + // Increment the iterator first. + ++I; if (VRM.isAssignedReg(UnfoldVR)) continue; // If this reference is not a use, any previous store is now dead. @@ -1380,11 +1383,14 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { // physical registers that may contain the value of the spilled virtual // register SmallSet<int, 2> FoldedSS; - for (tie(I, End) = VRM.getFoldedVirts(&MI); I != End; ++I) { + for (tie(I, End) = VRM.getFoldedVirts(&MI); I != End; ) { unsigned VirtReg = I->second.first; VirtRegMap::ModRef MR = I->second.second; DOUT << "Folded vreg: " << VirtReg << " MR: " << MR; + // MI2VirtMap be can updated which invalidate the iterator. + // Increment the iterator first. + ++I; int SS = VRM.getStackSlot(VirtReg); if (SS == VirtRegMap::NO_STACK_SLOT) continue; diff --git a/test/CodeGen/X86/2008-03-14-SpillerCrash.ll b/test/CodeGen/X86/2008-03-14-SpillerCrash.ll new file mode 100644 index 0000000..544c9b5 --- /dev/null +++ b/test/CodeGen/X86/2008-03-14-SpillerCrash.ll @@ -0,0 +1,48 @@ +; RUN: llvm-as < %s | llc -mtriple=i386-pc-linux-gnu +; PR2138 + + %struct.__locale_struct = type { [13 x %struct.locale_data*], i16*, i32*, i32*, [13 x i8*] } + %struct.anon = type { i8* } + %struct.locale_data = type { i8*, i8*, i32, i32, { void (%struct.locale_data*)*, %struct.anon }, i32, i32, i32, [0 x %struct.locale_data_value] } + %struct.locale_data_value = type { i32* } + +@wcstoll_l = alias i64 (i32*, i32**, i32, %struct.__locale_struct*)* @__wcstoll_l ; <i64 (i32*, i32**, i32, %struct.__locale_struct*)*> [#uses=0] + +define i64 @____wcstoll_l_internal(i32* %nptr, i32** %endptr, i32 %base, i32 %group, %struct.__locale_struct* %loc) nounwind { +entry: + %tmp27 = load i32* null, align 4 ; <i32> [#uses=1] + %tmp83 = getelementptr i32* %nptr, i32 1 ; <i32*> [#uses=1] + %tmp233 = add i32 0, -48 ; <i32> [#uses=1] + br label %bb271.us +bb271.us: ; preds = %entry + br label %bb374.outer +bb311.split: ; preds = %bb305.us + %tmp313 = add i32 %tmp378.us, -48 ; <i32> [#uses=1] + br i1 false, label %bb374.outer, label %bb383 +bb327.split: ; preds = %bb314.us + ret i64 0 +bb374.outer: ; preds = %bb311.split, %bb271.us + %tmp370371552.pn.in = phi i32 [ %tmp233, %bb271.us ], [ %tmp313, %bb311.split ] ; <i32> [#uses=1] + %tmp278279.pn = phi i64 [ 0, %bb271.us ], [ %tmp373.reg2mem.0.ph, %bb311.split ] ; <i64> [#uses=1] + %s.5.ph = phi i32* [ null, %bb271.us ], [ %tmp376.us, %bb311.split ] ; <i32*> [#uses=1] + %tmp366367550.pn = sext i32 %base to i64 ; <i64> [#uses=1] + %tmp370371552.pn = zext i32 %tmp370371552.pn.in to i64 ; <i64> [#uses=1] + %tmp369551.pn = mul i64 %tmp278279.pn, %tmp366367550.pn ; <i64> [#uses=1] + %tmp373.reg2mem.0.ph = add i64 %tmp370371552.pn, %tmp369551.pn ; <i64> [#uses=1] + br label %bb374.us +bb374.us: ; preds = %bb314.us, %bb374.outer + %tmp376.us = getelementptr i32* %s.5.ph, i32 0 ; <i32*> [#uses=3] + %tmp378.us = load i32* %tmp376.us, align 4 ; <i32> [#uses=2] + %tmp302.us = icmp eq i32* %tmp376.us, %tmp83 ; <i1> [#uses=1] + %bothcond484.us = or i1 false, %tmp302.us ; <i1> [#uses=1] + br i1 %bothcond484.us, label %bb383, label %bb305.us +bb305.us: ; preds = %bb374.us + br i1 false, label %bb311.split, label %bb314.us +bb314.us: ; preds = %bb305.us + %tmp320.us = icmp eq i32 %tmp378.us, %tmp27 ; <i1> [#uses=1] + br i1 %tmp320.us, label %bb374.us, label %bb327.split +bb383: ; preds = %bb374.us, %bb311.split + ret i64 0 +} + +declare i64 @__wcstoll_l(i32*, i32**, i32, %struct.__locale_struct*) nounwind |