From f1cba2320d8473644366148593324da46e1d18c9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 9 Oct 2025 11:29:06 +0200 Subject: [PATCH] [AddressSanitizer] Avoid unnecessary ptr<->int casts for stack poisoning Instead of casting pointers to integers to perform arithmetic on them, use ptradd. We still need some casts when interfacing with the asan runtime. (Why does the runtime define everything in terms of uptr rather than `void*`?) --- .../Instrumentation/AddressSanitizer.cpp | 72 +++---- .../AddressSanitizer/asan-funclet.ll | 195 +++++++++--------- .../AddressSanitizer/fake-stack.ll | 88 ++++---- .../AddressSanitizer/lifetime.ll | 92 ++++----- .../AddressSanitizer/local_stack_base.ll | 5 +- .../stack-poisoning-byval-args.ll | 6 +- .../AddressSanitizer/stack_dynamic_alloca.ll | 7 +- 7 files changed, 218 insertions(+), 247 deletions(-) diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 3704ad7652215..873296be7b259 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -3339,7 +3339,7 @@ PHINode *FunctionStackPoisoner::createPHI(IRBuilder<> &IRB, Value *Cond, Value *ValueIfTrue, Instruction *ThenTerm, Value *ValueIfFalse) { - PHINode *PHI = IRB.CreatePHI(IntptrTy, 2); + PHINode *PHI = IRB.CreatePHI(ValueIfTrue->getType(), 2); BasicBlock *CondBlock = cast(Cond)->getParent(); PHI->addIncoming(ValueIfFalse, CondBlock); BasicBlock *ThenBlock = ThenTerm->getParent(); @@ -3362,7 +3362,7 @@ Value *FunctionStackPoisoner::createAllocaForLayout( assert((ClRealignStack & (ClRealignStack - 1)) == 0); uint64_t FrameAlignment = std::max(L.FrameAlignment, uint64_t(ClRealignStack)); Alloca->setAlignment(Align(FrameAlignment)); - return IRB.CreatePointerCast(Alloca, IntptrTy); + return Alloca; } void FunctionStackPoisoner::createDynamicAllocasInitStorage() { @@ -3574,10 +3574,12 @@ void FunctionStackPoisoner::processStaticAllocas() { DoDynamicAlloca &= !HasInlineAsm && !HasReturnsTwiceCall; DoStackMalloc &= !HasInlineAsm && !HasReturnsTwiceCall; + Type *PtrTy = F.getDataLayout().getAllocaPtrType(F.getContext()); Value *StaticAlloca = DoDynamicAlloca ? nullptr : createAllocaForLayout(IRB, L, false); - Value *FakeStack; + Value *FakeStackPtr; + Value *FakeStackInt; Value *LocalStackBase; Value *LocalStackBaseAlloca; uint8_t DIExprFlags = DIExpression::ApplyOffset; @@ -3605,20 +3607,21 @@ void FunctionStackPoisoner::processStaticAllocas() { RTCI.createRuntimeCall(IRBIf, AsanStackMallocFunc[StackMallocIdx], ConstantInt::get(IntptrTy, LocalStackSize)); IRB.SetInsertPoint(InsBefore); - FakeStack = createPHI(IRB, UseAfterReturnIsEnabled, FakeStackValue, Term, - ConstantInt::get(IntptrTy, 0)); + FakeStackInt = createPHI(IRB, UseAfterReturnIsEnabled, FakeStackValue, + Term, ConstantInt::get(IntptrTy, 0)); } else { // assert(ASan.UseAfterReturn == AsanDetectStackUseAfterReturnMode:Always) // void *FakeStack = __asan_stack_malloc_N(LocalStackSize); // void *LocalStackBase = (FakeStack) ? FakeStack : // alloca(LocalStackSize); StackMallocIdx = StackMallocSizeClass(LocalStackSize); - FakeStack = + FakeStackInt = RTCI.createRuntimeCall(IRB, AsanStackMallocFunc[StackMallocIdx], ConstantInt::get(IntptrTy, LocalStackSize)); } + FakeStackPtr = IRB.CreateIntToPtr(FakeStackInt, PtrTy); Value *NoFakeStack = - IRB.CreateICmpEQ(FakeStack, Constant::getNullValue(IntptrTy)); + IRB.CreateICmpEQ(FakeStackInt, Constant::getNullValue(IntptrTy)); Instruction *Term = SplitBlockAndInsertIfThen(NoFakeStack, InsBefore, false); IRBuilder<> IRBIf(Term); @@ -3626,67 +3629,53 @@ void FunctionStackPoisoner::processStaticAllocas() { DoDynamicAlloca ? createAllocaForLayout(IRBIf, L, true) : StaticAlloca; IRB.SetInsertPoint(InsBefore); - LocalStackBase = createPHI(IRB, NoFakeStack, AllocaValue, Term, FakeStack); + LocalStackBase = + createPHI(IRB, NoFakeStack, AllocaValue, Term, FakeStackPtr); IRB.CreateStore(LocalStackBase, LocalStackBaseAlloca); DIExprFlags |= DIExpression::DerefBefore; } else { // void *FakeStack = nullptr; // void *LocalStackBase = alloca(LocalStackSize); - FakeStack = ConstantInt::get(IntptrTy, 0); + FakeStackInt = Constant::getNullValue(IntptrTy); + FakeStackPtr = Constant::getNullValue(PtrTy); LocalStackBase = DoDynamicAlloca ? createAllocaForLayout(IRB, L, true) : StaticAlloca; LocalStackBaseAlloca = LocalStackBase; } - // It shouldn't matter whether we pass an `alloca` or a `ptrtoint` as the - // dbg.declare address opereand, but passing a `ptrtoint` seems to confuse - // later passes and can result in dropped variable coverage in debug info. - Value *LocalStackBaseAllocaPtr = - isa(LocalStackBaseAlloca) - ? cast(LocalStackBaseAlloca)->getPointerOperand() - : LocalStackBaseAlloca; - assert(isa(LocalStackBaseAllocaPtr) && - "Variable descriptions relative to ASan stack base will be dropped"); - // Replace Alloca instructions with base+offset. SmallVector NewAllocaPtrs; for (const auto &Desc : SVD) { AllocaInst *AI = Desc.AI; - replaceDbgDeclare(AI, LocalStackBaseAllocaPtr, DIB, DIExprFlags, - Desc.Offset); - Value *NewAllocaPtr = IRB.CreateIntToPtr( - IRB.CreateAdd(LocalStackBase, ConstantInt::get(IntptrTy, Desc.Offset)), - AI->getType()); + replaceDbgDeclare(AI, LocalStackBaseAlloca, DIB, DIExprFlags, Desc.Offset); + Value *NewAllocaPtr = IRB.CreatePtrAdd( + LocalStackBase, ConstantInt::get(IntptrTy, Desc.Offset)); AI->replaceAllUsesWith(NewAllocaPtr); NewAllocaPtrs.push_back(NewAllocaPtr); } // The left-most redzone has enough space for at least 4 pointers. // Write the Magic value to redzone[0]. - Value *BasePlus0 = IRB.CreateIntToPtr(LocalStackBase, IntptrPtrTy); IRB.CreateStore(ConstantInt::get(IntptrTy, kCurrentStackFrameMagic), - BasePlus0); + LocalStackBase); // Write the frame description constant to redzone[1]. - Value *BasePlus1 = IRB.CreateIntToPtr( - IRB.CreateAdd(LocalStackBase, - ConstantInt::get(IntptrTy, ASan.LongSize / 8)), - IntptrPtrTy); + Value *BasePlus1 = IRB.CreatePtrAdd( + LocalStackBase, ConstantInt::get(IntptrTy, ASan.LongSize / 8)); GlobalVariable *StackDescriptionGlobal = createPrivateGlobalForString(*F.getParent(), DescriptionString, /*AllowMerging*/ true, genName("stack")); Value *Description = IRB.CreatePointerCast(StackDescriptionGlobal, IntptrTy); IRB.CreateStore(Description, BasePlus1); // Write the PC to redzone[2]. - Value *BasePlus2 = IRB.CreateIntToPtr( - IRB.CreateAdd(LocalStackBase, - ConstantInt::get(IntptrTy, 2 * ASan.LongSize / 8)), - IntptrPtrTy); + Value *BasePlus2 = IRB.CreatePtrAdd( + LocalStackBase, ConstantInt::get(IntptrTy, 2 * ASan.LongSize / 8)); IRB.CreateStore(IRB.CreatePointerCast(&F, IntptrTy), BasePlus2); const auto &ShadowAfterScope = GetShadowBytesAfterScope(SVD, L); // Poison the stack red zones at the entry. - Value *ShadowBase = ASan.memToShadow(LocalStackBase, IRB); + Value *ShadowBase = + ASan.memToShadow(IRB.CreatePtrToInt(LocalStackBase, IntptrTy), IRB); // As mask we must use most poisoned case: red zones and after scope. // As bytes we can use either the same or just red zones only. copyToShadow(ShadowAfterScope, ShadowAfterScope, IRB, ShadowBase); @@ -3725,7 +3714,7 @@ void FunctionStackPoisoner::processStaticAllocas() { IRBuilder<> IRBRet(Ret); // Mark the current frame as retired. IRBRet.CreateStore(ConstantInt::get(IntptrTy, kRetiredStackFrameMagic), - BasePlus0); + LocalStackBase); if (DoStackMalloc) { assert(StackMallocIdx >= 0); // if FakeStack != 0 // LocalStackBase == FakeStack @@ -3739,7 +3728,7 @@ void FunctionStackPoisoner::processStaticAllocas() { // else // Value *Cmp = - IRBRet.CreateICmpNE(FakeStack, Constant::getNullValue(IntptrTy)); + IRBRet.CreateICmpNE(FakeStackInt, Constant::getNullValue(IntptrTy)); Instruction *ThenTerm, *ElseTerm; SplitBlockAndInsertIfThenElse(Cmp, Ret, &ThenTerm, &ElseTerm); @@ -3750,11 +3739,10 @@ void FunctionStackPoisoner::processStaticAllocas() { kAsanStackUseAfterReturnMagic); copyToShadow(ShadowAfterReturn, ShadowAfterReturn, IRBPoison, ShadowBase); - Value *SavedFlagPtrPtr = IRBPoison.CreateAdd( - FakeStack, + Value *SavedFlagPtrPtr = IRBPoison.CreatePtrAdd( + FakeStackPtr, ConstantInt::get(IntptrTy, ClassSize - ASan.LongSize / 8)); - Value *SavedFlagPtr = IRBPoison.CreateLoad( - IntptrTy, IRBPoison.CreateIntToPtr(SavedFlagPtrPtr, IntptrPtrTy)); + Value *SavedFlagPtr = IRBPoison.CreateLoad(IntptrTy, SavedFlagPtrPtr); IRBPoison.CreateStore( Constant::getNullValue(IRBPoison.getInt8Ty()), IRBPoison.CreateIntToPtr(SavedFlagPtr, IRBPoison.getPtrTy())); @@ -3762,7 +3750,7 @@ void FunctionStackPoisoner::processStaticAllocas() { // For larger frames call __asan_stack_free_*. RTCI.createRuntimeCall( IRBPoison, AsanStackFreeFunc[StackMallocIdx], - {FakeStack, ConstantInt::get(IntptrTy, LocalStackSize)}); + {FakeStackInt, ConstantInt::get(IntptrTy, LocalStackSize)}); } IRBuilder<> IRBElse(ElseTerm); diff --git a/llvm/test/Instrumentation/AddressSanitizer/asan-funclet.ll b/llvm/test/Instrumentation/AddressSanitizer/asan-funclet.ll index ae8b2b385ac09..f94bc4f5ea123 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/asan-funclet.ll +++ b/llvm/test/Instrumentation/AddressSanitizer/asan-funclet.ll @@ -23,7 +23,7 @@ declare i32 @dummyPersonality(...) define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr @__CxxFrameHandler3 { ; CHECK-INLINE-LABEL: define void @FuncletPersonality( -; CHECK-INLINE-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR3:[0-9]+]] personality ptr @__CxxFrameHandler3 { +; CHECK-INLINE-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR2:[0-9]+]] personality ptr @__CxxFrameHandler3 { ; CHECK-INLINE-NEXT: entry: ; CHECK-INLINE-NEXT: [[TMP0:%.*]] = alloca i64, align 32 ; CHECK-INLINE-NEXT: store i64 0, ptr [[TMP0]], align 8 @@ -37,33 +37,26 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-INLINE-NEXT: br label [[TMP6]] ; CHECK-INLINE: 6: ; CHECK-INLINE-NEXT: [[TMP7:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[TMP5]], [[TMP4]] ] +; CHECK-INLINE-NEXT: [[TMP10:%.*]] = inttoptr i64 [[TMP7]] to ptr ; CHECK-INLINE-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP11:%.*]] -; CHECK-INLINE: 9: +; CHECK-INLINE: 10: ; CHECK-INLINE-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 8544, align 32 -; CHECK-INLINE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; CHECK-INLINE-NEXT: br label [[TMP11]] ; CHECK-INLINE: 11: -; CHECK-INLINE-NEXT: [[TMP12:%.*]] = phi i64 [ [[TMP7]], [[TMP6]] ], [ [[TMP10]], [[TMP9]] ] -; CHECK-INLINE-NEXT: store i64 [[TMP12]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 -; CHECK-INLINE-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 32 -; CHECK-INLINE-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr -; CHECK-INLINE-NEXT: [[TMP15:%.*]] = add i64 [[TMP12]], 8480 -; CHECK-INLINE-NEXT: [[TMP16:%.*]] = inttoptr i64 [[TMP15]] to ptr -; CHECK-INLINE-NEXT: [[TMP17:%.*]] = add i64 [[TMP12]], 8496 -; CHECK-INLINE-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr -; CHECK-INLINE-NEXT: [[TMP19:%.*]] = add i64 [[TMP12]], 8512 -; CHECK-INLINE-NEXT: [[TMP20:%.*]] = inttoptr i64 [[TMP19]] to ptr -; CHECK-INLINE-NEXT: [[TMP21:%.*]] = add i64 [[TMP12]], 8528 -; CHECK-INLINE-NEXT: [[TMP22:%.*]] = inttoptr i64 [[TMP21]] to ptr -; CHECK-INLINE-NEXT: [[TMP23:%.*]] = inttoptr i64 [[TMP12]] to ptr +; CHECK-INLINE-NEXT: [[TMP23:%.*]] = phi ptr [ [[TMP10]], [[TMP6]] ], [ [[MYALLOCA]], [[TMP9]] ] +; CHECK-INLINE-NEXT: store ptr [[TMP23]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 +; CHECK-INLINE-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP23]], i64 32 +; CHECK-INLINE-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[TMP23]], i64 8480 +; CHECK-INLINE-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP23]], i64 8496 +; CHECK-INLINE-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP23]], i64 8512 +; CHECK-INLINE-NEXT: [[TMP22:%.*]] = getelementptr i8, ptr [[TMP23]], i64 8528 ; CHECK-INLINE-NEXT: store i64 1102416563, ptr [[TMP23]], align 8 -; CHECK-INLINE-NEXT: [[TMP24:%.*]] = add i64 [[TMP12]], 8 -; CHECK-INLINE-NEXT: [[TMP25:%.*]] = inttoptr i64 [[TMP24]] to ptr +; CHECK-INLINE-NEXT: [[TMP25:%.*]] = getelementptr i8, ptr [[TMP23]], i64 8 ; CHECK-INLINE-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP25]], align 8 -; CHECK-INLINE-NEXT: [[TMP26:%.*]] = add i64 [[TMP12]], 16 -; CHECK-INLINE-NEXT: [[TMP27:%.*]] = inttoptr i64 [[TMP26]] to ptr +; CHECK-INLINE-NEXT: [[TMP27:%.*]] = getelementptr i8, ptr [[TMP23]], i64 16 ; CHECK-INLINE-NEXT: store i64 ptrtoint (ptr @FuncletPersonality to i64), ptr [[TMP27]], align 8 +; CHECK-INLINE-NEXT: [[TMP12:%.*]] = ptrtoint ptr [[TMP23]] to i64 ; CHECK-INLINE-NEXT: [[TMP28:%.*]] = lshr i64 [[TMP12]], 3 ; CHECK-INLINE-NEXT: [[TMP29:%.*]] = add i64 [[TMP28]], [[TMP1]] ; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f1(i64 [[TMP29]], i64 4) @@ -87,21 +80,22 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f3(i64 [[TMP38]], i64 1) ; CHECK-INLINE-NEXT: [[TMP39:%.*]] = add i64 [[TMP29]], 1066 ; CHECK-INLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP39]], i64 1) +; CHECK-INLINE-NEXT: [[TMP21:%.*]] = ptrtoint ptr [[TMP22]] to i64 ; CHECK-INLINE-NEXT: [[TMP40:%.*]] = lshr i64 [[TMP21]], 3 ; CHECK-INLINE-NEXT: [[TMP41:%.*]] = add i64 [[TMP40]], [[TMP1]] ; CHECK-INLINE-NEXT: [[TMP42:%.*]] = inttoptr i64 [[TMP41]] to ptr ; CHECK-INLINE-NEXT: [[TMP43:%.*]] = load i8, ptr [[TMP42]], align 1 ; CHECK-INLINE-NEXT: [[TMP44:%.*]] = icmp ne i8 [[TMP43]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP44]], label [[TMP45:%.*]], label [[TMP50:%.*]], !prof [[PROF1:![0-9]+]] -; CHECK-INLINE: 45: +; CHECK-INLINE: 39: ; CHECK-INLINE-NEXT: [[TMP46:%.*]] = and i64 [[TMP21]], 7 ; CHECK-INLINE-NEXT: [[TMP47:%.*]] = trunc i64 [[TMP46]] to i8 ; CHECK-INLINE-NEXT: [[TMP48:%.*]] = icmp sge i8 [[TMP47]], [[TMP43]] ; CHECK-INLINE-NEXT: br i1 [[TMP48]], label [[TMP49:%.*]], label [[TMP50]] -; CHECK-INLINE: 49: +; CHECK-INLINE: 43: ; CHECK-INLINE-NEXT: call void @__asan_report_store1(i64 [[TMP21]]) #[[ATTR7:[0-9]+]] ; CHECK-INLINE-NEXT: unreachable -; CHECK-INLINE: 50: +; CHECK-INLINE: 44: ; CHECK-INLINE-NEXT: store volatile i8 0, ptr [[TMP22]], align 1 ; CHECK-INLINE-NEXT: [[TMP51:%.*]] = add i64 [[TMP29]], 1066 ; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f8(i64 [[TMP51]], i64 1) @@ -125,10 +119,10 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-INLINE-NEXT: [[TMP65:%.*]] = load i8, ptr [[TMP64]], align 1 ; CHECK-INLINE-NEXT: [[TMP66:%.*]] = icmp ne i8 [[TMP65]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP66]], label [[TMP67:%.*]], label [[TMP68:%.*]] -; CHECK-INLINE: 67: +; CHECK-INLINE: 61: ; CHECK-INLINE-NEXT: call void @__asan_report_store8(i64 [[TMP59]]) #[[ATTR7]] ; CHECK-INLINE-NEXT: unreachable -; CHECK-INLINE: 68: +; CHECK-INLINE: 62: ; CHECK-INLINE-NEXT: store volatile i64 0, ptr [[TMP61]], align 8 ; CHECK-INLINE-NEXT: [[TMPCOPYI64:%.*]] = load i64, ptr [[TMP61]], align 8 ; CHECK-INLINE-NEXT: [[TMP69:%.*]] = and i64 [[TMPCOPYI64]], 31 @@ -150,15 +144,15 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-INLINE-NEXT: [[TMP83:%.*]] = load i8, ptr [[TMP82]], align 1 ; CHECK-INLINE-NEXT: [[TMP84:%.*]] = icmp ne i8 [[TMP83]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP84]], label [[TMP85:%.*]], label [[TMP90:%.*]], !prof [[PROF1]] -; CHECK-INLINE: 85: +; CHECK-INLINE: 79: ; CHECK-INLINE-NEXT: [[TMP86:%.*]] = and i64 [[TMP77]], 7 ; CHECK-INLINE-NEXT: [[TMP87:%.*]] = trunc i64 [[TMP86]] to i8 ; CHECK-INLINE-NEXT: [[TMP88:%.*]] = icmp sge i8 [[TMP87]], [[TMP83]] ; CHECK-INLINE-NEXT: br i1 [[TMP88]], label [[TMP89:%.*]], label [[TMP90]] -; CHECK-INLINE: 89: +; CHECK-INLINE: 83: ; CHECK-INLINE-NEXT: call void @__asan_report_store1(i64 [[TMP77]]) #[[ATTR7]] ; CHECK-INLINE-NEXT: unreachable -; CHECK-INLINE: 90: +; CHECK-INLINE: 84: ; CHECK-INLINE-NEXT: store volatile i8 0, ptr [[TMP79]], align 1 ; CHECK-INLINE-NEXT: invoke void @MayThrowFunc() ; CHECK-INLINE-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[EHCLEANUP:%.*]] @@ -170,15 +164,15 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-INLINE-NEXT: store i64 1172321806, ptr [[TMP23]], align 8 ; CHECK-INLINE-NEXT: [[TMP93:%.*]] = icmp ne i64 [[TMP7]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP93]], label [[TMP94:%.*]], label [[TMP95:%.*]] -; CHECK-INLINE: 94: +; CHECK-INLINE: 88: ; CHECK-INLINE-NEXT: call void @__asan_stack_free_8(i64 [[TMP7]], i64 8544) ; CHECK-INLINE-NEXT: br label [[TMP97:%.*]] -; CHECK-INLINE: 95: +; CHECK-INLINE: 89: ; CHECK-INLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP29]], i64 4) ; CHECK-INLINE-NEXT: [[TMP96:%.*]] = add i64 [[TMP29]], 1028 ; CHECK-INLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP96]], i64 40) ; CHECK-INLINE-NEXT: br label [[TMP97]] -; CHECK-INLINE: 97: +; CHECK-INLINE: 91: ; CHECK-INLINE-NEXT: ret void ; CHECK-INLINE: ehcleanup: ; CHECK-INLINE-NEXT: [[TMP98:%.*]] = cleanuppad within none [] @@ -189,23 +183,28 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-INLINE-NEXT: [[TMP102:%.*]] = load i8, ptr [[TMP101]], align 1 ; CHECK-INLINE-NEXT: [[TMP103:%.*]] = icmp ne i8 [[TMP102]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP103]], label [[TMP104:%.*]], label [[TMP109:%.*]], !prof [[PROF1]] -; CHECK-INLINE: 104: +; CHECK-INLINE: 98: ; CHECK-INLINE-NEXT: [[TMP105:%.*]] = and i64 [[TMP54]], 7 ; CHECK-INLINE-NEXT: [[TMP106:%.*]] = trunc i64 [[TMP105]] to i8 ; CHECK-INLINE-NEXT: [[TMP107:%.*]] = icmp sge i8 [[TMP106]], [[TMP102]] ; CHECK-INLINE-NEXT: br i1 [[TMP107]], label [[TMP108:%.*]], label [[TMP109]] -; CHECK-INLINE: 108: +; CHECK-INLINE: 102: ; CHECK-INLINE-NEXT: call void @__asan_report_store1(i64 [[TMP54]]) #[[ATTR7]] [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: unreachable -; CHECK-INLINE: 109: +; CHECK-INLINE: 103: ; CHECK-INLINE-NEXT: store volatile i8 0, ptr [[TMP56]], align 1 ; CHECK-INLINE-NEXT: call void @__asan_poison_stack_memory(i64 [[TMP54]], i64 4) [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: call void @DeInit(ptr [[TMP14]]) [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: [[TMP110:%.*]] = call ptr @__asan_memset(ptr [[TMP16]], i32 0, i64 4) [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: [[TMP111:%.*]] = call ptr @__asan_memcpy(ptr [[TMP18]], ptr [[TMP16]], i64 4) [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: [[TMP112:%.*]] = call ptr @__asan_memmove(ptr [[TMP20]], ptr [[TMP16]], i64 4) [ "funclet"(token [[TMP98]]) ] +; CHECK-INLINE-NEXT: [[TMP15:%.*]] = ptrtoint ptr [[TMP16]] to i64 +; CHECK-INLINE-NEXT: [[TMP17:%.*]] = ptrtoint ptr [[TMP18]] to i64 ; CHECK-INLINE-NEXT: call void @__sanitizer_ptr_cmp(i64 [[TMP15]], i64 [[TMP17]]) [ "funclet"(token [[TMP98]]) ] -; CHECK-INLINE-NEXT: call void @__sanitizer_ptr_sub(i64 [[TMP15]], i64 [[TMP17]]) [ "funclet"(token [[TMP98]]) ] +; CHECK-INLINE-NEXT: [[ADDR1:%.*]] = ptrtoint ptr [[TMP16]] to i64 +; CHECK-INLINE-NEXT: [[ADDR2:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; CHECK-INLINE-NEXT: call void @__sanitizer_ptr_sub(i64 [[ADDR1]], i64 [[ADDR2]]) [ "funclet"(token [[TMP98]]) ] +; CHECK-INLINE-NEXT: [[SUBADDR:%.*]] = sub i64 [[ADDR1]], [[ADDR2]] ; CHECK-INLINE-NEXT: [[TMP113:%.*]] = ptrtoint ptr [[PTRPARAM]] to i64 ; CHECK-INLINE-NEXT: [[TMP114:%.*]] = add i64 [[TMP113]], 7 ; CHECK-INLINE-NEXT: [[TMP115:%.*]] = inttoptr i64 [[TMP114]] to ptr @@ -216,31 +215,38 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-INLINE-NEXT: [[TMP120:%.*]] = load i8, ptr [[TMP119]], align 1 ; CHECK-INLINE-NEXT: [[TMP121:%.*]] = icmp ne i8 [[TMP120]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP121]], label [[TMP122:%.*]], label [[TMP127:%.*]], !prof [[PROF1]] -; CHECK-INLINE: 122: +; CHECK-INLINE: 118: ; CHECK-INLINE-NEXT: [[TMP123:%.*]] = and i64 [[TMP116]], 7 ; CHECK-INLINE-NEXT: [[TMP124:%.*]] = trunc i64 [[TMP123]] to i8 ; CHECK-INLINE-NEXT: [[TMP125:%.*]] = icmp sge i8 [[TMP124]], [[TMP120]] ; CHECK-INLINE-NEXT: br i1 [[TMP125]], label [[TMP126:%.*]], label [[TMP127]] -; CHECK-INLINE: 126: +; CHECK-INLINE: 122: ; CHECK-INLINE-NEXT: call void @__asan_report_store_n(i64 [[TMP116]], i64 8) #[[ATTR7]] [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: unreachable -; CHECK-INLINE: 127: +; CHECK-INLINE: 123: ; CHECK-INLINE-NEXT: [[TMP128:%.*]] = lshr i64 [[TMP114]], 3 ; CHECK-INLINE-NEXT: [[TMP129:%.*]] = add i64 [[TMP128]], [[TMP1]] ; CHECK-INLINE-NEXT: [[TMP130:%.*]] = inttoptr i64 [[TMP129]] to ptr ; CHECK-INLINE-NEXT: [[TMP131:%.*]] = load i8, ptr [[TMP130]], align 1 ; CHECK-INLINE-NEXT: [[TMP132:%.*]] = icmp ne i8 [[TMP131]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP132]], label [[TMP133:%.*]], label [[EHEXIT:%.*]], !prof [[PROF1]] -; CHECK-INLINE: 133: +; CHECK-INLINE: 129: ; CHECK-INLINE-NEXT: [[TMP134:%.*]] = and i64 [[TMP114]], 7 ; CHECK-INLINE-NEXT: [[TMP135:%.*]] = trunc i64 [[TMP134]] to i8 ; CHECK-INLINE-NEXT: [[TMP136:%.*]] = icmp sge i8 [[TMP135]], [[TMP131]] ; CHECK-INLINE-NEXT: br i1 [[TMP136]], label [[TMP137:%.*]], label [[EHEXIT]] -; CHECK-INLINE: 137: +; CHECK-INLINE: 133: ; CHECK-INLINE-NEXT: call void @__asan_report_store_n(i64 [[TMP114]], i64 8) #[[ATTR7]] [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: unreachable -; CHECK-INLINE: ehexit: +; CHECK-INLINE: 134: ; CHECK-INLINE-NEXT: store i64 0, ptr [[PTRPARAM]], align 1 +; CHECK-INLINE-NEXT: [[CMP:%.*]] = icmp ne i64 [[SUBADDR]], 0 +; CHECK-INLINE-NEXT: br i1 [[CMP]], label [[EHEXIT1:%.*]], label [[NORETURNCALL:%.*]] +; CHECK-INLINE: noreturncall: +; CHECK-INLINE-NEXT: call void @__asan_handle_no_return() [ "funclet"(token [[TMP98]]) ] +; CHECK-INLINE-NEXT: call void @NoReturn(ptr null, ptr null) #[[ATTR0:[0-9]+]] [ "funclet"(token [[TMP98]]) ] +; CHECK-INLINE-NEXT: unreachable +; CHECK-INLINE: ehexit: ; CHECK-INLINE-NEXT: [[TMP138:%.*]] = call i64 @llvm.get.dynamic.area.offset.i64() ; CHECK-INLINE-NEXT: [[TMP139:%.*]] = ptrtoint ptr [[TMP0]] to i64 ; CHECK-INLINE-NEXT: [[TMP140:%.*]] = add i64 [[TMP139]], [[TMP138]] @@ -249,19 +255,19 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-INLINE-NEXT: store i64 1172321806, ptr [[TMP23]], align 8 ; CHECK-INLINE-NEXT: [[TMP142:%.*]] = icmp ne i64 [[TMP7]], 0 ; CHECK-INLINE-NEXT: br i1 [[TMP142]], label [[TMP143:%.*]], label [[TMP144:%.*]] -; CHECK-INLINE: 143: +; CHECK-INLINE: 140: ; CHECK-INLINE-NEXT: call void @__asan_stack_free_8(i64 [[TMP7]], i64 8544) [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: br label [[TMP146:%.*]] -; CHECK-INLINE: 144: +; CHECK-INLINE: 141: ; CHECK-INLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP29]], i64 4) [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: [[TMP145:%.*]] = add i64 [[TMP29]], 1028 ; CHECK-INLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP145]], i64 40) [ "funclet"(token [[TMP98]]) ] ; CHECK-INLINE-NEXT: br label [[TMP146]] -; CHECK-INLINE: 146: +; CHECK-INLINE: 143: ; CHECK-INLINE-NEXT: cleanupret from [[TMP98]] unwind to caller ; ; CHECK-OUTLINE-LABEL: define void @FuncletPersonality( -; CHECK-OUTLINE-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR3:[0-9]+]] personality ptr @__CxxFrameHandler3 { +; CHECK-OUTLINE-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR2:[0-9]+]] personality ptr @__CxxFrameHandler3 { ; CHECK-OUTLINE-NEXT: entry: ; CHECK-OUTLINE-NEXT: [[TMP0:%.*]] = alloca i64, align 32 ; CHECK-OUTLINE-NEXT: store i64 0, ptr [[TMP0]], align 8 @@ -275,37 +281,28 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-OUTLINE-NEXT: br label [[TMP6]] ; CHECK-OUTLINE: 6: ; CHECK-OUTLINE-NEXT: [[TMP7:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[TMP5]], [[TMP4]] ] +; CHECK-OUTLINE-NEXT: [[TMP10:%.*]] = inttoptr i64 [[TMP7]] to ptr ; CHECK-OUTLINE-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 0 ; CHECK-OUTLINE-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP11:%.*]] -; CHECK-OUTLINE: 9: +; CHECK-OUTLINE: 10: ; CHECK-OUTLINE-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 8608, align 32 -; CHECK-OUTLINE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; CHECK-OUTLINE-NEXT: br label [[TMP11]] ; CHECK-OUTLINE: 11: -; CHECK-OUTLINE-NEXT: [[TMP12:%.*]] = phi i64 [ [[TMP7]], [[TMP6]] ], [ [[TMP10]], [[TMP9]] ] -; CHECK-OUTLINE-NEXT: store i64 [[TMP12]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 -; CHECK-OUTLINE-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 32 -; CHECK-OUTLINE-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr -; CHECK-OUTLINE-NEXT: [[TMP15:%.*]] = add i64 [[TMP12]], 8480 -; CHECK-OUTLINE-NEXT: [[TMP16:%.*]] = inttoptr i64 [[TMP15]] to ptr -; CHECK-OUTLINE-NEXT: [[TMP17:%.*]] = add i64 [[TMP12]], 8496 -; CHECK-OUTLINE-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr -; CHECK-OUTLINE-NEXT: [[TMP19:%.*]] = add i64 [[TMP12]], 8512 -; CHECK-OUTLINE-NEXT: [[TMP20:%.*]] = inttoptr i64 [[TMP19]] to ptr -; CHECK-OUTLINE-NEXT: [[TMP21:%.*]] = add i64 [[TMP12]], 8528 -; CHECK-OUTLINE-NEXT: [[TMP22:%.*]] = inttoptr i64 [[TMP21]] to ptr -; CHECK-OUTLINE-NEXT: [[TMP23:%.*]] = add i64 [[TMP12]], 8544 -; CHECK-OUTLINE-NEXT: [[TMP24:%.*]] = inttoptr i64 [[TMP23]] to ptr -; CHECK-OUTLINE-NEXT: [[TMP25:%.*]] = add i64 [[TMP12]], 8560 -; CHECK-OUTLINE-NEXT: [[TMP26:%.*]] = inttoptr i64 [[TMP25]] to ptr -; CHECK-OUTLINE-NEXT: [[TMP27:%.*]] = inttoptr i64 [[TMP12]] to ptr +; CHECK-OUTLINE-NEXT: [[TMP27:%.*]] = phi ptr [ [[TMP10]], [[TMP6]] ], [ [[MYALLOCA]], [[TMP9]] ] +; CHECK-OUTLINE-NEXT: store ptr [[TMP27]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 +; CHECK-OUTLINE-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP27]], i64 32 +; CHECK-OUTLINE-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[TMP27]], i64 8480 +; CHECK-OUTLINE-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP27]], i64 8496 +; CHECK-OUTLINE-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP27]], i64 8512 +; CHECK-OUTLINE-NEXT: [[TMP22:%.*]] = getelementptr i8, ptr [[TMP27]], i64 8528 +; CHECK-OUTLINE-NEXT: [[TMP24:%.*]] = getelementptr i8, ptr [[TMP27]], i64 8544 +; CHECK-OUTLINE-NEXT: [[TMP26:%.*]] = getelementptr i8, ptr [[TMP27]], i64 8560 ; CHECK-OUTLINE-NEXT: store i64 1102416563, ptr [[TMP27]], align 8 -; CHECK-OUTLINE-NEXT: [[TMP28:%.*]] = add i64 [[TMP12]], 8 -; CHECK-OUTLINE-NEXT: [[TMP29:%.*]] = inttoptr i64 [[TMP28]] to ptr +; CHECK-OUTLINE-NEXT: [[TMP29:%.*]] = getelementptr i8, ptr [[TMP27]], i64 8 ; CHECK-OUTLINE-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP29]], align 8 -; CHECK-OUTLINE-NEXT: [[TMP30:%.*]] = add i64 [[TMP12]], 16 -; CHECK-OUTLINE-NEXT: [[TMP31:%.*]] = inttoptr i64 [[TMP30]] to ptr +; CHECK-OUTLINE-NEXT: [[TMP31:%.*]] = getelementptr i8, ptr [[TMP27]], i64 16 ; CHECK-OUTLINE-NEXT: store i64 ptrtoint (ptr @FuncletPersonality to i64), ptr [[TMP31]], align 8 +; CHECK-OUTLINE-NEXT: [[TMP12:%.*]] = ptrtoint ptr [[TMP27]] to i64 ; CHECK-OUTLINE-NEXT: [[TMP32:%.*]] = lshr i64 [[TMP12]], 3 ; CHECK-OUTLINE-NEXT: [[TMP33:%.*]] = add i64 [[TMP32]], [[TMP1]] ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f1(i64 [[TMP33]], i64 4) @@ -335,10 +332,12 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f3(i64 [[TMP45]], i64 5) ; CHECK-OUTLINE-NEXT: [[TMP46:%.*]] = add i64 [[TMP33]], 1066 ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP46]], i64 1) +; CHECK-OUTLINE-NEXT: [[TMP21:%.*]] = ptrtoint ptr [[TMP22]] to i64 ; CHECK-OUTLINE-NEXT: call void @__asan_store1(i64 [[TMP21]]) ; CHECK-OUTLINE-NEXT: store volatile i8 0, ptr [[TMP22]], align 1 ; CHECK-OUTLINE-NEXT: [[TMP47:%.*]] = add i64 [[TMP33]], 1066 ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f8(i64 [[TMP47]], i64 1) +; CHECK-OUTLINE-NEXT: [[TMP25:%.*]] = ptrtoint ptr [[TMP26]] to i64 ; CHECK-OUTLINE-NEXT: call void @__asan_store8(i64 [[TMP25]]) ; CHECK-OUTLINE-NEXT: store volatile i64 0, ptr [[TMP26]], align 8 ; CHECK-OUTLINE-NEXT: [[TMPCOPYI64:%.*]] = load i64, ptr [[TMP26]], align 8 @@ -367,22 +366,23 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-OUTLINE-NEXT: store i64 1172321806, ptr [[TMP27]], align 8 ; CHECK-OUTLINE-NEXT: [[TMP61:%.*]] = icmp ne i64 [[TMP7]], 0 ; CHECK-OUTLINE-NEXT: br i1 [[TMP61]], label [[TMP62:%.*]], label [[TMP63:%.*]] -; CHECK-OUTLINE: 62: +; CHECK-OUTLINE: 55: ; CHECK-OUTLINE-NEXT: call void @__asan_stack_free_8(i64 [[TMP7]], i64 8608) ; CHECK-OUTLINE-NEXT: br label [[TMP66:%.*]] -; CHECK-OUTLINE: 63: +; CHECK-OUTLINE: 56: ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP33]], i64 4) ; CHECK-OUTLINE-NEXT: [[TMP64:%.*]] = add i64 [[TMP33]], 1028 ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP64]], i64 42) ; CHECK-OUTLINE-NEXT: [[TMP65:%.*]] = add i64 [[TMP33]], 1071 ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP65]], i64 5) ; CHECK-OUTLINE-NEXT: br label [[TMP66]] -; CHECK-OUTLINE: 66: +; CHECK-OUTLINE: 59: ; CHECK-OUTLINE-NEXT: ret void ; CHECK-OUTLINE: ehcleanup: ; CHECK-OUTLINE-NEXT: [[TMP67:%.*]] = cleanuppad within none [] ; CHECK-OUTLINE-NEXT: [[TMP68:%.*]] = add i64 [[TMP33]], 1068 ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP68]], i64 1) [ "funclet"(token [[TMP67]]) ] +; CHECK-OUTLINE-NEXT: [[TMP23:%.*]] = ptrtoint ptr [[TMP24]] to i64 ; CHECK-OUTLINE-NEXT: call void @__asan_store1(i64 [[TMP23]]) [ "funclet"(token [[TMP67]]) ] ; CHECK-OUTLINE-NEXT: store volatile i8 0, ptr [[TMP24]], align 1 ; CHECK-OUTLINE-NEXT: [[TMP69:%.*]] = add i64 [[TMP33]], 1068 @@ -391,11 +391,23 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-OUTLINE-NEXT: [[TMP70:%.*]] = call ptr @__asan_memset(ptr [[TMP16]], i32 0, i64 4) [ "funclet"(token [[TMP67]]) ] ; CHECK-OUTLINE-NEXT: [[TMP71:%.*]] = call ptr @__asan_memcpy(ptr [[TMP18]], ptr [[TMP16]], i64 4) [ "funclet"(token [[TMP67]]) ] ; CHECK-OUTLINE-NEXT: [[TMP72:%.*]] = call ptr @__asan_memmove(ptr [[TMP20]], ptr [[TMP16]], i64 4) [ "funclet"(token [[TMP67]]) ] +; CHECK-OUTLINE-NEXT: [[TMP15:%.*]] = ptrtoint ptr [[TMP16]] to i64 +; CHECK-OUTLINE-NEXT: [[TMP17:%.*]] = ptrtoint ptr [[TMP18]] to i64 ; CHECK-OUTLINE-NEXT: call void @__sanitizer_ptr_cmp(i64 [[TMP15]], i64 [[TMP17]]) [ "funclet"(token [[TMP67]]) ] -; CHECK-OUTLINE-NEXT: call void @__sanitizer_ptr_sub(i64 [[TMP15]], i64 [[TMP17]]) [ "funclet"(token [[TMP67]]) ] +; CHECK-OUTLINE-NEXT: [[ADDR1:%.*]] = ptrtoint ptr [[TMP16]] to i64 +; CHECK-OUTLINE-NEXT: [[ADDR2:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; CHECK-OUTLINE-NEXT: call void @__sanitizer_ptr_sub(i64 [[ADDR1]], i64 [[ADDR2]]) [ "funclet"(token [[TMP67]]) ] +; CHECK-OUTLINE-NEXT: [[SUBADDR:%.*]] = sub i64 [[ADDR1]], [[ADDR2]] ; CHECK-OUTLINE-NEXT: [[TMP73:%.*]] = ptrtoint ptr [[PTRPARAM]] to i64 ; CHECK-OUTLINE-NEXT: call void @__asan_storeN(i64 [[TMP73]], i64 8) [ "funclet"(token [[TMP67]]) ] ; CHECK-OUTLINE-NEXT: store i64 0, ptr [[PTRPARAM]], align 1 +; CHECK-OUTLINE-NEXT: [[CMP:%.*]] = icmp ne i64 [[SUBADDR]], 0 +; CHECK-OUTLINE-NEXT: br i1 [[CMP]], label [[EHEXIT:%.*]], label [[NORETURNCALL:%.*]] +; CHECK-OUTLINE: noreturncall: +; CHECK-OUTLINE-NEXT: call void @__asan_handle_no_return() [ "funclet"(token [[TMP67]]) ] +; CHECK-OUTLINE-NEXT: call void @NoReturn(ptr null, ptr null) #[[ATTR0:[0-9]+]] [ "funclet"(token [[TMP67]]) ] +; CHECK-OUTLINE-NEXT: unreachable +; CHECK-OUTLINE: ehexit: ; CHECK-OUTLINE-NEXT: [[TMP74:%.*]] = call i64 @llvm.get.dynamic.area.offset.i64() ; CHECK-OUTLINE-NEXT: [[TMP75:%.*]] = ptrtoint ptr [[TMP0]] to i64 ; CHECK-OUTLINE-NEXT: [[TMP76:%.*]] = add i64 [[TMP75]], [[TMP74]] @@ -404,17 +416,17 @@ define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr ; CHECK-OUTLINE-NEXT: store i64 1172321806, ptr [[TMP27]], align 8 ; CHECK-OUTLINE-NEXT: [[TMP78:%.*]] = icmp ne i64 [[TMP7]], 0 ; CHECK-OUTLINE-NEXT: br i1 [[TMP78]], label [[TMP79:%.*]], label [[TMP80:%.*]] -; CHECK-OUTLINE: 79: +; CHECK-OUTLINE: 75: ; CHECK-OUTLINE-NEXT: call void @__asan_stack_free_8(i64 [[TMP7]], i64 8608) [ "funclet"(token [[TMP67]]) ] ; CHECK-OUTLINE-NEXT: br label [[TMP83:%.*]] -; CHECK-OUTLINE: 80: +; CHECK-OUTLINE: 76: ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP33]], i64 4) [ "funclet"(token [[TMP67]]) ] ; CHECK-OUTLINE-NEXT: [[TMP81:%.*]] = add i64 [[TMP33]], 1028 ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP81]], i64 42) [ "funclet"(token [[TMP67]]) ] ; CHECK-OUTLINE-NEXT: [[TMP82:%.*]] = add i64 [[TMP33]], 1071 ; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP82]], i64 5) [ "funclet"(token [[TMP67]]) ] ; CHECK-OUTLINE-NEXT: br label [[TMP83]] -; CHECK-OUTLINE: 83: +; CHECK-OUTLINE: 79: ; CHECK-OUTLINE-NEXT: cleanupret from [[TMP67]] unwind to caller ; @@ -487,7 +499,7 @@ nopredecessor: ; Non-Windows personality, ensure no funclet gets attached to asan runtime call. define void @OtherPersonality(ptr %ptrParam) sanitize_address personality ptr @dummyPersonality { ; CHECK-LABEL: define void @OtherPersonality( -; CHECK-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR3:[0-9]+]] personality ptr @dummyPersonality { +; CHECK-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR2:[0-9]+]] personality ptr @dummyPersonality { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__asan_shadow_memory_dynamic_address, align 8 ; CHECK-NEXT: [[ASAN_LOCAL_STACK_BASE:%.*]] = alloca i64, align 8 @@ -499,25 +511,22 @@ define void @OtherPersonality(ptr %ptrParam) sanitize_address personality ptr @d ; CHECK-NEXT: br label [[TMP5]] ; CHECK: 5: ; CHECK-NEXT: [[TMP6:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[TMP4]], [[TMP3]] ] +; CHECK-NEXT: [[TMP9:%.*]] = inttoptr i64 [[TMP6]] to ptr ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP6]], 0 ; CHECK-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP10:%.*]] -; CHECK: 8: +; CHECK: 9: ; CHECK-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 64, align 32 -; CHECK-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; CHECK-NEXT: br label [[TMP10]] ; CHECK: 10: -; CHECK-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP6]], [[TMP5]] ], [ [[TMP9]], [[TMP8]] ] -; CHECK-NEXT: store i64 [[TMP11]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 -; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[TMP11]], 32 -; CHECK-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP12]] to ptr -; CHECK-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP11]] to ptr +; CHECK-NEXT: [[TMP14:%.*]] = phi ptr [ [[TMP9]], [[TMP5]] ], [ [[MYALLOCA]], [[TMP8]] ] +; CHECK-NEXT: store ptr [[TMP14]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 +; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[TMP14]], i64 32 ; CHECK-NEXT: store i64 1102416563, ptr [[TMP14]], align 8 -; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[TMP11]], 8 -; CHECK-NEXT: [[TMP16:%.*]] = inttoptr i64 [[TMP15]] to ptr +; CHECK-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[TMP14]], i64 8 ; CHECK-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack.1 to i64), ptr [[TMP16]], align 8 -; CHECK-NEXT: [[TMP17:%.*]] = add i64 [[TMP11]], 16 -; CHECK-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr +; CHECK-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP14]], i64 16 ; CHECK-NEXT: store i64 ptrtoint (ptr @OtherPersonality to i64), ptr [[TMP18]], align 8 +; CHECK-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP14]] to i64 ; CHECK-NEXT: [[TMP19:%.*]] = lshr i64 [[TMP11]], 3 ; CHECK-NEXT: [[TMP20:%.*]] = add i64 [[TMP19]], [[TMP0]] ; CHECK-NEXT: [[TMP21:%.*]] = add i64 [[TMP20]], 0 @@ -532,14 +541,14 @@ define void @OtherPersonality(ptr %ptrParam) sanitize_address personality ptr @d ; CHECK-NEXT: store i64 1172321806, ptr [[TMP14]], align 8 ; CHECK-NEXT: [[TMP24:%.*]] = icmp ne i64 [[TMP6]], 0 ; CHECK-NEXT: br i1 [[TMP24]], label [[TMP25:%.*]], label [[TMP26:%.*]] -; CHECK: 25: +; CHECK: 22: ; CHECK-NEXT: call void @__asan_stack_free_0(i64 [[TMP6]], i64 64) ; CHECK-NEXT: br label [[TMP28:%.*]] -; CHECK: 26: +; CHECK: 23: ; CHECK-NEXT: [[TMP27:%.*]] = add i64 [[TMP20]], 0 ; CHECK-NEXT: call void @__asan_set_shadow_00(i64 [[TMP27]], i64 8) ; CHECK-NEXT: br label [[TMP28]] -; CHECK: 28: +; CHECK: 25: ; CHECK-NEXT: ret void ; CHECK: ehcleanup: ; CHECK-NEXT: [[TMP29:%.*]] = cleanuppad within none [] @@ -547,14 +556,14 @@ define void @OtherPersonality(ptr %ptrParam) sanitize_address personality ptr @d ; CHECK-NEXT: store i64 1172321806, ptr [[TMP14]], align 8 ; CHECK-NEXT: [[TMP31:%.*]] = icmp ne i64 [[TMP6]], 0 ; CHECK-NEXT: br i1 [[TMP31]], label [[TMP32:%.*]], label [[TMP33:%.*]] -; CHECK: 32: +; CHECK: 29: ; CHECK-NEXT: call void @__asan_stack_free_0(i64 [[TMP6]], i64 64) ; CHECK-NEXT: br label [[TMP35:%.*]] -; CHECK: 33: +; CHECK: 30: ; CHECK-NEXT: [[TMP34:%.*]] = add i64 [[TMP20]], 0 ; CHECK-NEXT: call void @__asan_set_shadow_00(i64 [[TMP34]], i64 8) ; CHECK-NEXT: br label [[TMP35]] -; CHECK: 35: +; CHECK: 32: ; CHECK-NEXT: cleanupret from [[TMP29]] unwind to caller ; entry: diff --git a/llvm/test/Instrumentation/AddressSanitizer/fake-stack.ll b/llvm/test/Instrumentation/AddressSanitizer/fake-stack.ll index 3cccabb13cbc6..1b00cd8303444 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/fake-stack.ll +++ b/llvm/test/Instrumentation/AddressSanitizer/fake-stack.ll @@ -20,24 +20,20 @@ define void @Simple() uwtable sanitize_address { ; NEVER-LABEL: @Simple( ; NEVER-NEXT: entry: ; NEVER-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 64, align 32 -; NEVER-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 -; NEVER-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], 32 -; NEVER-NEXT: [[TMP2:%.*]] = inttoptr i64 [[TMP1]] to ptr -; NEVER-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP0]] to ptr -; NEVER-NEXT: store i64 1102416563, ptr [[TMP3]], align 8 -; NEVER-NEXT: [[TMP4:%.*]] = add i64 [[TMP0]], 8 -; NEVER-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr +; NEVER-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 32 +; NEVER-NEXT: store i64 1102416563, ptr [[MYALLOCA]], align 8 +; NEVER-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 8 ; NEVER-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP5]], align 8 -; NEVER-NEXT: [[TMP6:%.*]] = add i64 [[TMP0]], 16 -; NEVER-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr +; NEVER-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 16 ; NEVER-NEXT: store i64 ptrtoint (ptr @Simple to i64), ptr [[TMP7]], align 8 +; NEVER-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; NEVER-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP0]], 3 ; NEVER-NEXT: [[TMP9:%.*]] = add i64 [[TMP8]], 2147450880 ; NEVER-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 0 ; NEVER-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP10]] to ptr ; NEVER-NEXT: store i64 -868083113472691727, ptr [[TMP11]], align 1 ; NEVER-NEXT: call void @Foo(ptr [[TMP2]]) -; NEVER-NEXT: store i64 1172321806, ptr [[TMP3]], align 8 +; NEVER-NEXT: store i64 1172321806, ptr [[MYALLOCA]], align 8 ; NEVER-NEXT: [[TMP12:%.*]] = add i64 [[TMP9]], 0 ; NEVER-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP12]] to ptr ; NEVER-NEXT: store i64 0, ptr [[TMP13]], align 1 @@ -54,25 +50,22 @@ define void @Simple() uwtable sanitize_address { ; RUNTIME-NEXT: br label [[TMP4]] ; RUNTIME: 4: ; RUNTIME-NEXT: [[TMP5:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[TMP3]], [[TMP2]] ] +; RUNTIME-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP5]] to ptr ; RUNTIME-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 0 ; RUNTIME-NEXT: br i1 [[TMP6]], label [[TMP7:%.*]], label [[TMP9:%.*]] -; RUNTIME: 7: +; RUNTIME: 8: ; RUNTIME-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 64, align 32 -; RUNTIME-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; RUNTIME-NEXT: br label [[TMP9]] ; RUNTIME: 9: -; RUNTIME-NEXT: [[TMP10:%.*]] = phi i64 [ [[TMP5]], [[TMP4]] ], [ [[TMP8]], [[TMP7]] ] -; RUNTIME-NEXT: store i64 [[TMP10]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 -; RUNTIME-NEXT: [[TMP11:%.*]] = add i64 [[TMP10]], 32 -; RUNTIME-NEXT: [[TMP12:%.*]] = inttoptr i64 [[TMP11]] to ptr -; RUNTIME-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP10]] to ptr +; RUNTIME-NEXT: [[TMP13:%.*]] = phi ptr [ [[TMP8]], [[TMP4]] ], [ [[MYALLOCA]], [[TMP7]] ] +; RUNTIME-NEXT: store ptr [[TMP13]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 +; RUNTIME-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP13]], i64 32 ; RUNTIME-NEXT: store i64 1102416563, ptr [[TMP13]], align 8 -; RUNTIME-NEXT: [[TMP14:%.*]] = add i64 [[TMP10]], 8 -; RUNTIME-NEXT: [[TMP15:%.*]] = inttoptr i64 [[TMP14]] to ptr +; RUNTIME-NEXT: [[TMP15:%.*]] = getelementptr i8, ptr [[TMP13]], i64 8 ; RUNTIME-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP15]], align 8 -; RUNTIME-NEXT: [[TMP16:%.*]] = add i64 [[TMP10]], 16 -; RUNTIME-NEXT: [[TMP17:%.*]] = inttoptr i64 [[TMP16]] to ptr +; RUNTIME-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[TMP13]], i64 16 ; RUNTIME-NEXT: store i64 ptrtoint (ptr @Simple to i64), ptr [[TMP17]], align 8 +; RUNTIME-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP13]] to i64 ; RUNTIME-NEXT: [[TMP18:%.*]] = lshr i64 [[TMP10]], 3 ; RUNTIME-NEXT: [[TMP19:%.*]] = add i64 [[TMP18]], 2147450880 ; RUNTIME-NEXT: [[TMP20:%.*]] = add i64 [[TMP19]], 0 @@ -82,47 +75,43 @@ define void @Simple() uwtable sanitize_address { ; RUNTIME-NEXT: store i64 1172321806, ptr [[TMP13]], align 8 ; RUNTIME-NEXT: [[TMP22:%.*]] = icmp ne i64 [[TMP5]], 0 ; RUNTIME-NEXT: br i1 [[TMP22]], label [[TMP23:%.*]], label [[TMP30:%.*]] -; RUNTIME: 23: +; RUNTIME: 20: ; RUNTIME-NEXT: [[TMP24:%.*]] = add i64 [[TMP19]], 0 ; RUNTIME-NEXT: [[TMP25:%.*]] = inttoptr i64 [[TMP24]] to ptr ; RUNTIME-NEXT: store i64 -723401728380766731, ptr [[TMP25]], align 1 -; RUNTIME-NEXT: [[TMP26:%.*]] = add i64 [[TMP5]], 56 -; RUNTIME-NEXT: [[TMP27:%.*]] = inttoptr i64 [[TMP26]] to ptr +; RUNTIME-NEXT: [[TMP27:%.*]] = getelementptr i8, ptr [[TMP8]], i64 56 ; RUNTIME-NEXT: [[TMP28:%.*]] = load i64, ptr [[TMP27]], align 8 ; RUNTIME-NEXT: [[TMP29:%.*]] = inttoptr i64 [[TMP28]] to ptr ; RUNTIME-NEXT: store i8 0, ptr [[TMP29]], align 1 ; RUNTIME-NEXT: br label [[TMP33:%.*]] -; RUNTIME: 30: +; RUNTIME: 26: ; RUNTIME-NEXT: [[TMP31:%.*]] = add i64 [[TMP19]], 0 ; RUNTIME-NEXT: [[TMP32:%.*]] = inttoptr i64 [[TMP31]] to ptr ; RUNTIME-NEXT: store i64 0, ptr [[TMP32]], align 1 ; RUNTIME-NEXT: br label [[TMP33]] -; RUNTIME: 33: +; RUNTIME: 29: ; RUNTIME-NEXT: ret void ; ; ALWAYS-LABEL: @Simple( ; ALWAYS-NEXT: entry: ; ALWAYS-NEXT: [[ASAN_LOCAL_STACK_BASE:%.*]] = alloca i64, align 8 ; ALWAYS-NEXT: [[TMP0:%.*]] = call i64 @__asan_stack_malloc_always_0(i64 64) +; ALWAYS-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP0]] to ptr ; ALWAYS-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 0 ; ALWAYS-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP4:%.*]] -; ALWAYS: 2: +; ALWAYS: 3: ; ALWAYS-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 64, align 32 -; ALWAYS-NEXT: [[TMP3:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; ALWAYS-NEXT: br label [[TMP4]] ; ALWAYS: 4: -; ALWAYS-NEXT: [[TMP5:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[TMP3]], [[TMP2]] ] -; ALWAYS-NEXT: store i64 [[TMP5]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 -; ALWAYS-NEXT: [[TMP6:%.*]] = add i64 [[TMP5]], 32 -; ALWAYS-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr -; ALWAYS-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP5]] to ptr +; ALWAYS-NEXT: [[TMP8:%.*]] = phi ptr [ [[TMP3]], [[ENTRY:%.*]] ], [ [[MYALLOCA]], [[TMP2]] ] +; ALWAYS-NEXT: store ptr [[TMP8]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 +; ALWAYS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP8]], i64 32 ; ALWAYS-NEXT: store i64 1102416563, ptr [[TMP8]], align 8 -; ALWAYS-NEXT: [[TMP9:%.*]] = add i64 [[TMP5]], 8 -; ALWAYS-NEXT: [[TMP10:%.*]] = inttoptr i64 [[TMP9]] to ptr +; ALWAYS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP8]], i64 8 ; ALWAYS-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP10]], align 8 -; ALWAYS-NEXT: [[TMP11:%.*]] = add i64 [[TMP5]], 16 -; ALWAYS-NEXT: [[TMP12:%.*]] = inttoptr i64 [[TMP11]] to ptr +; ALWAYS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP8]], i64 16 ; ALWAYS-NEXT: store i64 ptrtoint (ptr @Simple to i64), ptr [[TMP12]], align 8 +; ALWAYS-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP8]] to i64 ; ALWAYS-NEXT: [[TMP13:%.*]] = lshr i64 [[TMP5]], 3 ; ALWAYS-NEXT: [[TMP14:%.*]] = add i64 [[TMP13]], 2147450880 ; ALWAYS-NEXT: [[TMP15:%.*]] = add i64 [[TMP14]], 0 @@ -132,22 +121,21 @@ define void @Simple() uwtable sanitize_address { ; ALWAYS-NEXT: store i64 1172321806, ptr [[TMP8]], align 8 ; ALWAYS-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP0]], 0 ; ALWAYS-NEXT: br i1 [[TMP17]], label [[TMP18:%.*]], label [[TMP25:%.*]] -; ALWAYS: 18: +; ALWAYS: 15: ; ALWAYS-NEXT: [[TMP19:%.*]] = add i64 [[TMP14]], 0 ; ALWAYS-NEXT: [[TMP20:%.*]] = inttoptr i64 [[TMP19]] to ptr ; ALWAYS-NEXT: store i64 -723401728380766731, ptr [[TMP20]], align 1 -; ALWAYS-NEXT: [[TMP21:%.*]] = add i64 [[TMP0]], 56 -; ALWAYS-NEXT: [[TMP22:%.*]] = inttoptr i64 [[TMP21]] to ptr +; ALWAYS-NEXT: [[TMP22:%.*]] = getelementptr i8, ptr [[TMP3]], i64 56 ; ALWAYS-NEXT: [[TMP23:%.*]] = load i64, ptr [[TMP22]], align 8 ; ALWAYS-NEXT: [[TMP24:%.*]] = inttoptr i64 [[TMP23]] to ptr ; ALWAYS-NEXT: store i8 0, ptr [[TMP24]], align 1 ; ALWAYS-NEXT: br label [[TMP28:%.*]] -; ALWAYS: 25: +; ALWAYS: 21: ; ALWAYS-NEXT: [[TMP26:%.*]] = add i64 [[TMP14]], 0 ; ALWAYS-NEXT: [[TMP27:%.*]] = inttoptr i64 [[TMP26]] to ptr ; ALWAYS-NEXT: store i64 0, ptr [[TMP27]], align 1 ; ALWAYS-NEXT: br label [[TMP28]] -; ALWAYS: 28: +; ALWAYS: 24: ; ALWAYS-NEXT: ret void ; entry: @@ -160,17 +148,13 @@ define void @Huge() uwtable sanitize_address { ; CHECK-LABEL: @Huge( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 100288, align 32 -; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 -; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], 32 -; CHECK-NEXT: [[TMP2:%.*]] = inttoptr i64 [[TMP1]] to ptr -; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP0]] to ptr -; CHECK-NEXT: store i64 1102416563, ptr [[TMP3]], align 8 -; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP0]], 8 -; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr +; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 32 +; CHECK-NEXT: store i64 1102416563, ptr [[MYALLOCA]], align 8 +; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 8 ; CHECK-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack.1 to i64), ptr [[TMP5]], align 8 -; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[TMP0]], 16 -; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr +; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 16 ; CHECK-NEXT: store i64 ptrtoint (ptr @Huge to i64), ptr [[TMP7]], align 8 +; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP0]], 3 ; CHECK-NEXT: [[TMP9:%.*]] = add i64 [[TMP8]], 2147450880 ; CHECK-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 0 @@ -189,7 +173,7 @@ define void @Huge() uwtable sanitize_address { ; CHECK-NEXT: [[TMP19:%.*]] = inttoptr i64 [[TMP18]] to ptr ; CHECK-NEXT: store i64 -868082074056920077, ptr [[TMP19]], align 1 ; CHECK-NEXT: call void @Foo(ptr [[TMP2]]) -; CHECK-NEXT: store i64 1172321806, ptr [[TMP3]], align 8 +; CHECK-NEXT: store i64 1172321806, ptr [[MYALLOCA]], align 8 ; CHECK-NEXT: [[TMP20:%.*]] = add i64 [[TMP9]], 0 ; CHECK-NEXT: [[TMP21:%.*]] = inttoptr i64 [[TMP20]] to ptr ; CHECK-NEXT: store i32 0, ptr [[TMP21]], align 1 diff --git a/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll b/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll index d1e01807f6c26..82e114e21a690 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll +++ b/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll @@ -16,17 +16,13 @@ define void @lifetime() sanitize_address { ; CHECK-DEFAULT-NEXT: [[TMP1:%.*]] = alloca i64, align 32 ; CHECK-DEFAULT-NEXT: store i64 0, ptr [[TMP1]], align 8 ; CHECK-DEFAULT-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 64, align 32 -; CHECK-DEFAULT-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 -; CHECK-DEFAULT-NEXT: [[TMP3:%.*]] = add i64 [[TMP2]], 32 -; CHECK-DEFAULT-NEXT: [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr -; CHECK-DEFAULT-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP2]] to ptr -; CHECK-DEFAULT-NEXT: store i64 1102416563, ptr [[TMP5]], align 8 -; CHECK-DEFAULT-NEXT: [[TMP6:%.*]] = add i64 [[TMP2]], 8 -; CHECK-DEFAULT-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr +; CHECK-DEFAULT-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 32 +; CHECK-DEFAULT-NEXT: store i64 1102416563, ptr [[MYALLOCA]], align 8 +; CHECK-DEFAULT-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 8 ; CHECK-DEFAULT-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP7]], align 8 -; CHECK-DEFAULT-NEXT: [[TMP8:%.*]] = add i64 [[TMP2]], 16 -; CHECK-DEFAULT-NEXT: [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr +; CHECK-DEFAULT-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 16 ; CHECK-DEFAULT-NEXT: store i64 ptrtoint (ptr @lifetime to i64), ptr [[TMP9]], align 8 +; CHECK-DEFAULT-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; CHECK-DEFAULT-NEXT: [[TMP10:%.*]] = lshr i64 [[TMP2]], 3 ; CHECK-DEFAULT-NEXT: [[TMP11:%.*]] = add i64 [[TMP10]], 2147450880 ; CHECK-DEFAULT-NEXT: [[TMP12:%.*]] = add i64 [[TMP11]], 0 @@ -41,16 +37,16 @@ define void @lifetime() sanitize_address { ; CHECK-DEFAULT-NEXT: [[TMP19:%.*]] = inttoptr i64 [[TMP18]] to ptr ; CHECK-DEFAULT-NEXT: [[TMP20:%.*]] = load i8, ptr [[TMP19]], align 1 ; CHECK-DEFAULT-NEXT: [[TMP21:%.*]] = icmp ne i8 [[TMP20]], 0 -; CHECK-DEFAULT-NEXT: br i1 [[TMP21]], label %[[BB22:.*]], label %[[BB27:.*]], !prof [[PROF1:![0-9]+]] -; CHECK-DEFAULT: [[BB22]]: +; CHECK-DEFAULT-NEXT: br i1 [[TMP21]], label %[[BB18:.*]], label %[[BB23:.*]], !prof [[PROF1:![0-9]+]] +; CHECK-DEFAULT: [[BB18]]: ; CHECK-DEFAULT-NEXT: [[TMP23:%.*]] = and i64 [[TMP16]], 7 ; CHECK-DEFAULT-NEXT: [[TMP24:%.*]] = trunc i64 [[TMP23]] to i8 ; CHECK-DEFAULT-NEXT: [[TMP25:%.*]] = icmp sge i8 [[TMP24]], [[TMP20]] -; CHECK-DEFAULT-NEXT: br i1 [[TMP25]], label %[[BB26:.*]], label %[[BB27]] -; CHECK-DEFAULT: [[BB26]]: +; CHECK-DEFAULT-NEXT: br i1 [[TMP25]], label %[[BB22:.*]], label %[[BB23]] +; CHECK-DEFAULT: [[BB22]]: ; CHECK-DEFAULT-NEXT: call void @__asan_report_store1(i64 [[TMP16]]) #[[ATTR4:[0-9]+]] ; CHECK-DEFAULT-NEXT: unreachable -; CHECK-DEFAULT: [[BB27]]: +; CHECK-DEFAULT: [[BB23]]: ; CHECK-DEFAULT-NEXT: store volatile i8 0, ptr [[TMP4]], align 1 ; CHECK-DEFAULT-NEXT: [[TMP28:%.*]] = add i64 [[TMP11]], 4 ; CHECK-DEFAULT-NEXT: [[TMP29:%.*]] = inttoptr i64 [[TMP28]] to ptr @@ -73,16 +69,16 @@ define void @lifetime() sanitize_address { ; CHECK-DEFAULT-NEXT: [[TMP41:%.*]] = inttoptr i64 [[TMP40]] to ptr ; CHECK-DEFAULT-NEXT: [[TMP42:%.*]] = load i8, ptr [[TMP41]], align 1 ; CHECK-DEFAULT-NEXT: [[TMP43:%.*]] = icmp ne i8 [[TMP42]], 0 -; CHECK-DEFAULT-NEXT: br i1 [[TMP43]], label %[[BB44:.*]], label %[[BB49:.*]], !prof [[PROF1]] -; CHECK-DEFAULT: [[BB44]]: +; CHECK-DEFAULT-NEXT: br i1 [[TMP43]], label %[[BB40:.*]], label %[[BB45:.*]], !prof [[PROF1]] +; CHECK-DEFAULT: [[BB40]]: ; CHECK-DEFAULT-NEXT: [[TMP45:%.*]] = and i64 [[TMP38]], 7 ; CHECK-DEFAULT-NEXT: [[TMP46:%.*]] = trunc i64 [[TMP45]] to i8 ; CHECK-DEFAULT-NEXT: [[TMP47:%.*]] = icmp sge i8 [[TMP46]], [[TMP42]] -; CHECK-DEFAULT-NEXT: br i1 [[TMP47]], label %[[BB48:.*]], label %[[BB49]] -; CHECK-DEFAULT: [[BB48]]: +; CHECK-DEFAULT-NEXT: br i1 [[TMP47]], label %[[BB44:.*]], label %[[BB45]] +; CHECK-DEFAULT: [[BB44]]: ; CHECK-DEFAULT-NEXT: call void @__asan_report_store1(i64 [[TMP38]]) #[[ATTR4]] ; CHECK-DEFAULT-NEXT: unreachable -; CHECK-DEFAULT: [[BB49]]: +; CHECK-DEFAULT: [[BB45]]: ; CHECK-DEFAULT-NEXT: store volatile i8 0, ptr [[TMP36]], align 1 ; CHECK-DEFAULT-NEXT: [[TMP50:%.*]] = ptrtoint ptr [[TMP36]] to i64 ; CHECK-DEFAULT-NEXT: call void @__asan_poison_stack_memory(i64 [[TMP50]], i64 40) @@ -95,16 +91,16 @@ define void @lifetime() sanitize_address { ; CHECK-DEFAULT-NEXT: [[TMP56:%.*]] = inttoptr i64 [[TMP55]] to ptr ; CHECK-DEFAULT-NEXT: [[TMP57:%.*]] = load i8, ptr [[TMP56]], align 1 ; CHECK-DEFAULT-NEXT: [[TMP58:%.*]] = icmp ne i8 [[TMP57]], 0 -; CHECK-DEFAULT-NEXT: br i1 [[TMP58]], label %[[BB59:.*]], label %[[BB64:.*]], !prof [[PROF1]] -; CHECK-DEFAULT: [[BB59]]: +; CHECK-DEFAULT-NEXT: br i1 [[TMP58]], label %[[BB55:.*]], label %[[BB60:.*]], !prof [[PROF1]] +; CHECK-DEFAULT: [[BB55]]: ; CHECK-DEFAULT-NEXT: [[TMP60:%.*]] = and i64 [[TMP53]], 7 ; CHECK-DEFAULT-NEXT: [[TMP61:%.*]] = trunc i64 [[TMP60]] to i8 ; CHECK-DEFAULT-NEXT: [[TMP62:%.*]] = icmp sge i8 [[TMP61]], [[TMP57]] -; CHECK-DEFAULT-NEXT: br i1 [[TMP62]], label %[[BB63:.*]], label %[[BB64]] -; CHECK-DEFAULT: [[BB63]]: +; CHECK-DEFAULT-NEXT: br i1 [[TMP62]], label %[[BB59:.*]], label %[[BB60]] +; CHECK-DEFAULT: [[BB59]]: ; CHECK-DEFAULT-NEXT: call void @__asan_report_store1(i64 [[TMP53]]) #[[ATTR4]] ; CHECK-DEFAULT-NEXT: unreachable -; CHECK-DEFAULT: [[BB64]]: +; CHECK-DEFAULT: [[BB60]]: ; CHECK-DEFAULT-NEXT: store volatile i8 0, ptr [[TMP4]], align 1 ; CHECK-DEFAULT-NEXT: [[TMP65:%.*]] = add i64 [[TMP11]], 4 ; CHECK-DEFAULT-NEXT: [[TMP66:%.*]] = inttoptr i64 [[TMP65]] to ptr @@ -112,7 +108,7 @@ define void @lifetime() sanitize_address { ; CHECK-DEFAULT-NEXT: [[TMP67:%.*]] = ptrtoint ptr [[TMP1]] to i64 ; CHECK-DEFAULT-NEXT: [[TMP68:%.*]] = load i64, ptr [[TMP1]], align 8 ; CHECK-DEFAULT-NEXT: call void @__asan_allocas_unpoison(i64 [[TMP68]], i64 [[TMP67]]) -; CHECK-DEFAULT-NEXT: store i64 1172321806, ptr [[TMP5]], align 8 +; CHECK-DEFAULT-NEXT: store i64 1172321806, ptr [[MYALLOCA]], align 8 ; CHECK-DEFAULT-NEXT: [[TMP69:%.*]] = add i64 [[TMP11]], 0 ; CHECK-DEFAULT-NEXT: [[TMP70:%.*]] = inttoptr i64 [[TMP69]] to ptr ; CHECK-DEFAULT-NEXT: store i64 0, ptr [[TMP70]], align 1 @@ -121,17 +117,13 @@ define void @lifetime() sanitize_address { ; CHECK-NO-DYNAMIC-LABEL: define void @lifetime( ; CHECK-NO-DYNAMIC-SAME: ) #[[ATTR0:[0-9]+]] { ; CHECK-NO-DYNAMIC-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 64, align 32 -; CHECK-NO-DYNAMIC-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 -; CHECK-NO-DYNAMIC-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], 32 -; CHECK-NO-DYNAMIC-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr -; CHECK-NO-DYNAMIC-NEXT: [[TMP4:%.*]] = inttoptr i64 [[TMP1]] to ptr -; CHECK-NO-DYNAMIC-NEXT: store i64 1102416563, ptr [[TMP4]], align 8 -; CHECK-NO-DYNAMIC-NEXT: [[TMP5:%.*]] = add i64 [[TMP1]], 8 -; CHECK-NO-DYNAMIC-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr +; CHECK-NO-DYNAMIC-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 32 +; CHECK-NO-DYNAMIC-NEXT: store i64 1102416563, ptr [[MYALLOCA]], align 8 +; CHECK-NO-DYNAMIC-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 8 ; CHECK-NO-DYNAMIC-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP6]], align 8 -; CHECK-NO-DYNAMIC-NEXT: [[TMP7:%.*]] = add i64 [[TMP1]], 16 -; CHECK-NO-DYNAMIC-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr +; CHECK-NO-DYNAMIC-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[MYALLOCA]], i64 16 ; CHECK-NO-DYNAMIC-NEXT: store i64 ptrtoint (ptr @lifetime to i64), ptr [[TMP8]], align 8 +; CHECK-NO-DYNAMIC-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 ; CHECK-NO-DYNAMIC-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP1]], 3 ; CHECK-NO-DYNAMIC-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 2147450880 ; CHECK-NO-DYNAMIC-NEXT: [[TMP11:%.*]] = add i64 [[TMP10]], 0 @@ -146,16 +138,16 @@ define void @lifetime() sanitize_address { ; CHECK-NO-DYNAMIC-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr ; CHECK-NO-DYNAMIC-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1 ; CHECK-NO-DYNAMIC-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP19]], 0 -; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP20]], label %[[BB21:.*]], label %[[BB26:.*]], !prof [[PROF1:![0-9]+]] -; CHECK-NO-DYNAMIC: [[BB21]]: +; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP20]], label %[[BB17:.*]], label %[[BB22:.*]], !prof [[PROF1:![0-9]+]] +; CHECK-NO-DYNAMIC: [[BB17]]: ; CHECK-NO-DYNAMIC-NEXT: [[TMP22:%.*]] = and i64 [[TMP15]], 7 ; CHECK-NO-DYNAMIC-NEXT: [[TMP23:%.*]] = trunc i64 [[TMP22]] to i8 ; CHECK-NO-DYNAMIC-NEXT: [[TMP24:%.*]] = icmp sge i8 [[TMP23]], [[TMP19]] -; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP24]], label %[[BB25:.*]], label %[[BB26]] -; CHECK-NO-DYNAMIC: [[BB25]]: +; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP24]], label %[[BB21:.*]], label %[[BB22]] +; CHECK-NO-DYNAMIC: [[BB21]]: ; CHECK-NO-DYNAMIC-NEXT: call void @__asan_report_store1(i64 [[TMP15]]) #[[ATTR4:[0-9]+]] ; CHECK-NO-DYNAMIC-NEXT: unreachable -; CHECK-NO-DYNAMIC: [[BB26]]: +; CHECK-NO-DYNAMIC: [[BB22]]: ; CHECK-NO-DYNAMIC-NEXT: store volatile i8 0, ptr [[TMP3]], align 1 ; CHECK-NO-DYNAMIC-NEXT: [[TMP27:%.*]] = add i64 [[TMP10]], 4 ; CHECK-NO-DYNAMIC-NEXT: [[TMP28:%.*]] = inttoptr i64 [[TMP27]] to ptr @@ -171,16 +163,16 @@ define void @lifetime() sanitize_address { ; CHECK-NO-DYNAMIC-NEXT: [[TMP34:%.*]] = inttoptr i64 [[TMP33]] to ptr ; CHECK-NO-DYNAMIC-NEXT: [[TMP35:%.*]] = load i8, ptr [[TMP34]], align 1 ; CHECK-NO-DYNAMIC-NEXT: [[TMP36:%.*]] = icmp ne i8 [[TMP35]], 0 -; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP36]], label %[[BB37:.*]], label %[[BB42:.*]], !prof [[PROF1]] -; CHECK-NO-DYNAMIC: [[BB37]]: +; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP36]], label %[[BB33:.*]], label %[[BB38:.*]], !prof [[PROF1]] +; CHECK-NO-DYNAMIC: [[BB33]]: ; CHECK-NO-DYNAMIC-NEXT: [[TMP38:%.*]] = and i64 [[TMP31]], 7 ; CHECK-NO-DYNAMIC-NEXT: [[TMP39:%.*]] = trunc i64 [[TMP38]] to i8 ; CHECK-NO-DYNAMIC-NEXT: [[TMP40:%.*]] = icmp sge i8 [[TMP39]], [[TMP35]] -; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP40]], label %[[BB41:.*]], label %[[BB42]] -; CHECK-NO-DYNAMIC: [[BB41]]: +; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP40]], label %[[BB37:.*]], label %[[BB38]] +; CHECK-NO-DYNAMIC: [[BB37]]: ; CHECK-NO-DYNAMIC-NEXT: call void @__asan_report_store1(i64 [[TMP31]]) #[[ATTR4]] ; CHECK-NO-DYNAMIC-NEXT: unreachable -; CHECK-NO-DYNAMIC: [[BB42]]: +; CHECK-NO-DYNAMIC: [[BB38]]: ; CHECK-NO-DYNAMIC-NEXT: store volatile i8 0, ptr [[ARR]], align 1 ; CHECK-NO-DYNAMIC-NEXT: call void @llvm.lifetime.end.p0(ptr [[ARR]]) ; CHECK-NO-DYNAMIC-NEXT: [[TMP43:%.*]] = add i64 [[TMP10]], 4 @@ -192,21 +184,21 @@ define void @lifetime() sanitize_address { ; CHECK-NO-DYNAMIC-NEXT: [[TMP48:%.*]] = inttoptr i64 [[TMP47]] to ptr ; CHECK-NO-DYNAMIC-NEXT: [[TMP49:%.*]] = load i8, ptr [[TMP48]], align 1 ; CHECK-NO-DYNAMIC-NEXT: [[TMP50:%.*]] = icmp ne i8 [[TMP49]], 0 -; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP50]], label %[[BB51:.*]], label %[[BB56:.*]], !prof [[PROF1]] -; CHECK-NO-DYNAMIC: [[BB51]]: +; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP50]], label %[[BB47:.*]], label %[[BB52:.*]], !prof [[PROF1]] +; CHECK-NO-DYNAMIC: [[BB47]]: ; CHECK-NO-DYNAMIC-NEXT: [[TMP52:%.*]] = and i64 [[TMP45]], 7 ; CHECK-NO-DYNAMIC-NEXT: [[TMP53:%.*]] = trunc i64 [[TMP52]] to i8 ; CHECK-NO-DYNAMIC-NEXT: [[TMP54:%.*]] = icmp sge i8 [[TMP53]], [[TMP49]] -; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP54]], label %[[BB55:.*]], label %[[BB56]] -; CHECK-NO-DYNAMIC: [[BB55]]: +; CHECK-NO-DYNAMIC-NEXT: br i1 [[TMP54]], label %[[BB51:.*]], label %[[BB52]] +; CHECK-NO-DYNAMIC: [[BB51]]: ; CHECK-NO-DYNAMIC-NEXT: call void @__asan_report_store1(i64 [[TMP45]]) #[[ATTR4]] ; CHECK-NO-DYNAMIC-NEXT: unreachable -; CHECK-NO-DYNAMIC: [[BB56]]: +; CHECK-NO-DYNAMIC: [[BB52]]: ; CHECK-NO-DYNAMIC-NEXT: store volatile i8 0, ptr [[TMP3]], align 1 ; CHECK-NO-DYNAMIC-NEXT: [[TMP57:%.*]] = add i64 [[TMP10]], 4 ; CHECK-NO-DYNAMIC-NEXT: [[TMP58:%.*]] = inttoptr i64 [[TMP57]] to ptr ; CHECK-NO-DYNAMIC-NEXT: store i8 -8, ptr [[TMP58]], align 1 -; CHECK-NO-DYNAMIC-NEXT: store i64 1172321806, ptr [[TMP4]], align 8 +; CHECK-NO-DYNAMIC-NEXT: store i64 1172321806, ptr [[MYALLOCA]], align 8 ; CHECK-NO-DYNAMIC-NEXT: [[TMP59:%.*]] = add i64 [[TMP10]], 0 ; CHECK-NO-DYNAMIC-NEXT: [[TMP60:%.*]] = inttoptr i64 [[TMP59]] to ptr ; CHECK-NO-DYNAMIC-NEXT: store i64 0, ptr [[TMP60]], align 1 diff --git a/llvm/test/Instrumentation/AddressSanitizer/local_stack_base.ll b/llvm/test/Instrumentation/AddressSanitizer/local_stack_base.ll index afa46e44e2824..8b0940d9f6baf 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/local_stack_base.ll +++ b/llvm/test/Instrumentation/AddressSanitizer/local_stack_base.ll @@ -16,9 +16,8 @@ entry: call void @llvm.dbg.declare(metadata ptr %i.addr, metadata !12, metadata !DIExpression()), !dbg !13 ; CHECK: %asan_local_stack_base = alloca i64 - ; CHECK: %[[ALLOCA:.*]] = ptrtoint ptr %MyAlloca to i64 - ; CHECK: %[[PHI:.*]] = phi i64 {{.*}} %[[ALLOCA]], - ; CHECK: store i64 %[[PHI]], ptr %asan_local_stack_base + ; CHECK: %[[PHI:.*]] = phi ptr {{.*}} %MyAlloca + ; CHECK: store ptr %[[PHI]], ptr %asan_local_stack_base ; CHECK: #dbg_declare(ptr %asan_local_stack_base, [[VAR_I:![0-9]+]], !DIExpression(DW_OP_deref, DW_OP_plus_uconst, 32), [[LOC_I:![0-9]+]] %0 = load i32, ptr %i.addr, align 4, !dbg !14 %add = add nsw i32 %0, 2, !dbg !15 diff --git a/llvm/test/Instrumentation/AddressSanitizer/stack-poisoning-byval-args.ll b/llvm/test/Instrumentation/AddressSanitizer/stack-poisoning-byval-args.ll index d85f21702146a..7e14987418e58 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/stack-poisoning-byval-args.ll +++ b/llvm/test/Instrumentation/AddressSanitizer/stack-poisoning-byval-args.ll @@ -19,8 +19,7 @@ entry: ; CHECK-LABEL: foo ; CHECK: call i64 @__asan_stack_malloc ; CHECK: alloca i8, i64 {{.*}} align 64 -; CHECK: [[copyPtr:%[^ \t]+]] = inttoptr i64 %{{[^ \t]+}} to ptr -; CHECK: call void @llvm.memcpy{{[^%]+}}[[copyPtr]]{{[^%]+}} align 64 %a,{{[^,]+}}, +; CHECK: call void @llvm.memcpy{{[^%]+}}[[copyPtr:%[0-9]+]]{{[^%]+}} align 64 %a,{{[^,]+}}, ; CHECK: call i32 @bar(ptr [[copyPtr]]) ; CHECK: ret void @@ -38,8 +37,7 @@ entry: ; CHECK-LABEL: baz ; CHECK: call i64 @__asan_stack_malloc ; CHECK: alloca i8, i64 {{.*}} align 32 -; CHECK: [[copyPtr:%[^ \t]+]] = inttoptr i64 %{{[^ \t]+}} to ptr -; CHECK: call void @llvm.memcpy{{[^%]+}}[[copyPtr]]{{[^%]+}} align 4 %0,{{[^,]+}} +; CHECK: call void @llvm.memcpy{{[^%]+}}[[copyPtr:%[0-9]+]]{{[^%]+}} align 4 %0,{{[^,]+}} ; CHECK: call i32 @bar(ptr [[copyPtr]]) ; CHECK: ret void diff --git a/llvm/test/Instrumentation/AddressSanitizer/stack_dynamic_alloca.ll b/llvm/test/Instrumentation/AddressSanitizer/stack_dynamic_alloca.ll index d56cd340d70ab..c8478c8b46803 100644 --- a/llvm/test/Instrumentation/AddressSanitizer/stack_dynamic_alloca.ll +++ b/llvm/test/Instrumentation/AddressSanitizer/stack_dynamic_alloca.ll @@ -19,15 +19,16 @@ entry: ; CHECK-RUNTIME: [[FAKE_STACK_BB:^[0-9]+]]: ; CHECK-RUNTIME: [[FAKE_STACK:%[0-9]+]] = phi i64 [ 0, %entry ], [ [[FAKE_STACK_RT]], %[[UAR_ENABLED_BB]] ] +; CHECK-RUNTIME: [[FAKE_STACK_PTR:%[0-9]+]] = inttoptr i64 [[FAKE_STACK]] to ptr +; CHECK-ALWAYS: [[FAKE_STACK_PTR:%[0-9]+]] = inttoptr i64 [[FAKE_STACK_RT]] to ptr ; CHECK-RUNTIME: icmp eq i64 [[FAKE_STACK]], 0 ; CHECK-ALWAYS: icmp eq i64 [[FAKE_STACK_RT]], 0 ; CHECK: [[NO_FAKE_STACK_BB:^[0-9]+]]: ; CHECK: %MyAlloca = alloca i8, i64 -; CHECK: [[ALLOCA:%[0-9]+]] = ptrtoint ptr %MyAlloca -; CHECK-RUNTIME: phi i64 [ [[FAKE_STACK]], %[[FAKE_STACK_BB]] ], [ [[ALLOCA]], %[[NO_FAKE_STACK_BB]] ] -; CHECK-ALWAYS: phi i64 [ [[FAKE_STACK_RT]], %entry ], [ [[ALLOCA]], %[[NO_FAKE_STACK_BB]] ] +; CHECK-RUNTIME: phi ptr [ [[FAKE_STACK_PTR]], %[[FAKE_STACK_BB]] ], [ %MyAlloca, %[[NO_FAKE_STACK_BB]] ] +; CHECK-ALWAYS: phi ptr [ [[FAKE_STACK_PTR]], %entry ], [ %MyAlloca, %[[NO_FAKE_STACK_BB]] ] ; CHECK: ret void