Index: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp =================================================================== --- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -638,7 +638,7 @@ ShadowMapping Mapping; SmallVector AllocaVec; - SmallSetVector NonInstrumentedStaticAllocaVec; + SmallVector StaticAllocasToMoveUp; SmallVector RetVec; unsigned StackAlignment; @@ -766,7 +766,14 @@ /// \brief Collect Alloca instructions we want (and can) handle. void visitAllocaInst(AllocaInst &AI) { if (!ASan.isInterestingAlloca(AI)) { - if (AI.isStaticAlloca()) NonInstrumentedStaticAllocaVec.insert(&AI); + if (AI.isStaticAlloca()) { + // Skip over allocas that are present *before* the first instrumented + // alloca, we don't want to move those around. + if (AllocaVec.empty()) + return; + + StaticAllocasToMoveUp.push_back(&AI); + } return; } @@ -2231,10 +2238,9 @@ // regular stack slots. auto InsBeforeB = InsBefore->getParent(); assert(InsBeforeB == &F.getEntryBlock()); - for (BasicBlock::iterator I(InsBefore); I != InsBeforeB->end(); ++I) - if (auto *AI = dyn_cast(I)) - if (NonInstrumentedStaticAllocaVec.count(AI) > 0) - AI->moveBefore(InsBefore); + for (auto *AI : StaticAllocasToMoveUp) + if (AI->getParent() == InsBeforeB) + AI->moveBefore(InsBefore); // If we have a call to llvm.localescape, keep it in the entry block. if (LocalEscapeCall) LocalEscapeCall->moveBefore(InsBefore); Index: llvm/trunk/test/Instrumentation/AddressSanitizer/debug_info_noninstrumented_alloca2.ll =================================================================== --- llvm/trunk/test/Instrumentation/AddressSanitizer/debug_info_noninstrumented_alloca2.ll +++ llvm/trunk/test/Instrumentation/AddressSanitizer/debug_info_noninstrumented_alloca2.ll @@ -0,0 +1,21 @@ +; Make sure we don't break the IR when moving non-instrumented allocas + +; RUN: opt < %s -asan -asan-module -S | FileCheck %s +; RUN: opt < %s -asan -asan-module -asan-instrument-dynamic-allocas -S | FileCheck %s + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.10.0" + +define i32 @foo() sanitize_address { +entry: + %non_instrumented1 = alloca i32, align 4 + %t = load i32, i32* %non_instrumented1, align 4 + %instrumented = alloca i32, align 4 + %ptr = ptrtoint i32* %instrumented to i32 + ret i32 %t +} + +; CHECK: entry: +; CHECK: %non_instrumented1 = alloca i32, align 4 +; CHECK: load i32, i32* %non_instrumented1 +; CHECK: load i32, i32* @__asan_option_detect_stack_use_after_return