mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
maned
llvm-svn: 277067
This commit is contained in:
parent
1effa6601e
commit
4e37730172
@ -1211,10 +1211,6 @@ static bool removeTriviallyEmptyRange(IntrinsicInst &I, unsigned StartID,
|
||||
unsigned EndID, InstCombiner &IC) {
|
||||
assert(I.getIntrinsicID() == StartID &&
|
||||
"Start intrinsic does not have expected ID");
|
||||
// Even if the range is empty asan need to poison memory to detect invalid
|
||||
// access latter.
|
||||
if (ClUseAfterScope)
|
||||
return false;
|
||||
BasicBlock::iterator BI(I), BE(I.getParent()->end());
|
||||
for (++BI; BI != BE; ++BI) {
|
||||
if (auto *E = dyn_cast<IntrinsicInst>(BI)) {
|
||||
@ -2248,11 +2244,18 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
return eraseInstFromFunction(CI);
|
||||
break;
|
||||
}
|
||||
case Intrinsic::lifetime_start:
|
||||
case Intrinsic::lifetime_start: {
|
||||
const Function *func = II->getFunction();
|
||||
// Asan needs to poison memory to detect invalid access possible even for
|
||||
// empty lifetime range.
|
||||
if (func && func->hasFnAttribute(Attribute::SanitizeAddress))
|
||||
break;
|
||||
|
||||
if (removeTriviallyEmptyRange(*II, Intrinsic::lifetime_start,
|
||||
Intrinsic::lifetime_end, *this))
|
||||
return nullptr;
|
||||
break;
|
||||
}
|
||||
case Intrinsic::assume: {
|
||||
Value *IIOperand = II->getArgOperand(0);
|
||||
// Remove an assume if it is immediately followed by an identical assume.
|
||||
@ -2483,7 +2486,6 @@ static IntrinsicInst *findInitTrampoline(Value *Callee) {
|
||||
|
||||
/// Improvements for call and invoke instructions.
|
||||
Instruction *InstCombiner::visitCallSite(CallSite CS) {
|
||||
|
||||
if (isAllocLikeFn(CS.getInstruction(), TLI))
|
||||
return visitAllocSite(*CS.getInstruction());
|
||||
|
||||
|
37
test/Transforms/InstCombine/lifetime-asan.ll
Normal file
37
test/Transforms/InstCombine/lifetime-asan.ll
Normal file
@ -0,0 +1,37 @@
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
declare void @llvm.lifetime.start(i64, i8* nocapture)
|
||||
declare void @llvm.lifetime.end(i64, i8* nocapture)
|
||||
declare void @foo(i8* nocapture)
|
||||
|
||||
define void @asan() sanitize_address {
|
||||
entry:
|
||||
; CHECK-LABEL: @asan(
|
||||
%text = alloca [1 x i8], align 1
|
||||
%0 = getelementptr inbounds [1 x i8], [1 x i8]* %text, i64 0, i64 0
|
||||
|
||||
call void @llvm.lifetime.start(i64 1, i8* %0)
|
||||
call void @llvm.lifetime.end(i64 1, i8* %0)
|
||||
; CHECK: call void @llvm.lifetime.start
|
||||
; CHECK-NEXT: call void @llvm.lifetime.end
|
||||
|
||||
call void @foo(i8* %0) ; Keep alloca alive
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
|
||||
define void @no_asan() {
|
||||
entry:
|
||||
; CHECK-LABEL: @no_asan(
|
||||
%text = alloca [1 x i8], align 1
|
||||
%0 = getelementptr inbounds [1 x i8], [1 x i8]* %text, i64 0, i64 0
|
||||
|
||||
call void @llvm.lifetime.start(i64 1, i8* %0)
|
||||
call void @llvm.lifetime.end(i64 1, i8* %0)
|
||||
; CHECK-NO: call void @llvm.lifetime
|
||||
|
||||
call void @foo(i8* %0) ; Keep alloca alive
|
||||
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user