mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-27 17:31:33 +00:00
Fix SimplifyLibcalls and ValueTracking to check mayBeOverridden
before performing optimizations based on constant string values. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79384 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2c9489d6e9
commit
107f41fad5
@ -1061,7 +1061,8 @@ bool llvm::GetConstantStringInfo(Value *V, std::string &Str, uint64_t Offset,
|
||||
// variable that is a constant and is initialized. The referenced constant
|
||||
// initializer is the array that we'll use for optimization.
|
||||
GlobalVariable* GV = dyn_cast<GlobalVariable>(V);
|
||||
if (!GV || !GV->isConstant() || !GV->hasInitializer())
|
||||
if (!GV || !GV->isConstant() || !GV->hasInitializer() ||
|
||||
GV->mayBeOverridden())
|
||||
return false;
|
||||
Constant *GlobalInit = GV->getInitializer();
|
||||
|
||||
|
@ -438,7 +438,8 @@ static uint64_t GetStringLengthH(Value *V, SmallPtrSet<PHINode*, 32> &PHIs) {
|
||||
// variable that is a constant and is initialized. The referenced constant
|
||||
// initializer is the array that we'll use for optimization.
|
||||
GlobalVariable* GV = dyn_cast<GlobalVariable>(GEP->getOperand(0));
|
||||
if (!GV || !GV->isConstant() || !GV->hasInitializer())
|
||||
if (!GV || !GV->isConstant() || !GV->hasInitializer() ||
|
||||
GV->mayBeOverridden())
|
||||
return 0;
|
||||
Constant *GlobalInit = GV->getInitializer();
|
||||
|
||||
|
26
test/Transforms/SimplifyLibCalls/weak-symbols.ll
Normal file
26
test/Transforms/SimplifyLibCalls/weak-symbols.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; RUN: llvm-as < %s | opt -simplify-libcalls | llvm-dis | FileCheck %s
|
||||
; PR4738
|
||||
|
||||
; SimplifyLibcalls shouldn't assume anything about weak symbols.
|
||||
|
||||
@real_init = weak_odr constant [2 x i8] c"y\00"
|
||||
@fake_init = weak constant [2 x i8] c"y\00"
|
||||
@.str = private constant [2 x i8] c"y\00"
|
||||
|
||||
; CHECK: define i32 @foo
|
||||
; CHECK: call i32 @strcmp
|
||||
define i32 @foo() nounwind {
|
||||
entry:
|
||||
%t0 = call i32 @strcmp(i8* getelementptr inbounds ([2 x i8]* @fake_init, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8]* @.str, i64 0, i64 0)) nounwind readonly
|
||||
ret i32 %t0
|
||||
}
|
||||
|
||||
; CHECK: define i32 @bar
|
||||
; CHECK: ret i32 0
|
||||
define i32 @bar() nounwind {
|
||||
entry:
|
||||
%t0 = call i32 @strcmp(i8* getelementptr inbounds ([2 x i8]* @real_init, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8]* @.str, i64 0, i64 0)) nounwind readonly
|
||||
ret i32 %t0
|
||||
}
|
||||
|
||||
declare i32 @strcmp(i8*, i8*) nounwind readonly
|
Loading…
x
Reference in New Issue
Block a user