mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Make getModRefInfo(Instruction *) not crash on certain types of instructions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236023 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3813ef6886
commit
b1e1aa04ed
@ -379,15 +379,18 @@ AliasAnalysis::getModRefInfo(const StoreInst *S, const Location &Loc) {
|
|||||||
|
|
||||||
AliasAnalysis::ModRefResult
|
AliasAnalysis::ModRefResult
|
||||||
AliasAnalysis::getModRefInfo(const VAArgInst *V, const Location &Loc) {
|
AliasAnalysis::getModRefInfo(const VAArgInst *V, const Location &Loc) {
|
||||||
|
|
||||||
|
if (Loc.Ptr) {
|
||||||
// If the va_arg address cannot alias the pointer in question, then the
|
// If the va_arg address cannot alias the pointer in question, then the
|
||||||
// specified memory cannot be accessed by the va_arg.
|
// specified memory cannot be accessed by the va_arg.
|
||||||
if (!alias(getLocation(V), Loc))
|
if (!alias(getLocation(V), Loc))
|
||||||
return NoModRef;
|
return NoModRef;
|
||||||
|
|
||||||
// If the pointer is a pointer to constant memory, then it could not have been
|
// If the pointer is a pointer to constant memory, then it could not have
|
||||||
// modified by this va_arg.
|
// been modified by this va_arg.
|
||||||
if (pointsToConstantMemory(Loc))
|
if (pointsToConstantMemory(Loc))
|
||||||
return NoModRef;
|
return NoModRef;
|
||||||
|
}
|
||||||
|
|
||||||
// Otherwise, a va_arg reads and writes.
|
// Otherwise, a va_arg reads and writes.
|
||||||
return ModRef;
|
return ModRef;
|
||||||
@ -400,7 +403,7 @@ AliasAnalysis::getModRefInfo(const AtomicCmpXchgInst *CX, const Location &Loc) {
|
|||||||
return ModRef;
|
return ModRef;
|
||||||
|
|
||||||
// If the cmpxchg address does not alias the location, it does not access it.
|
// If the cmpxchg address does not alias the location, it does not access it.
|
||||||
if (!alias(getLocation(CX), Loc))
|
if (Loc.Ptr && !alias(getLocation(CX), Loc))
|
||||||
return NoModRef;
|
return NoModRef;
|
||||||
|
|
||||||
return ModRef;
|
return ModRef;
|
||||||
@ -413,7 +416,7 @@ AliasAnalysis::getModRefInfo(const AtomicRMWInst *RMW, const Location &Loc) {
|
|||||||
return ModRef;
|
return ModRef;
|
||||||
|
|
||||||
// If the atomicrmw address does not alias the location, it does not access it.
|
// If the atomicrmw address does not alias the location, it does not access it.
|
||||||
if (!alias(getLocation(RMW), Loc))
|
if (Loc.Ptr && !alias(getLocation(RMW), Loc))
|
||||||
return NoModRef;
|
return NoModRef;
|
||||||
|
|
||||||
return ModRef;
|
return ModRef;
|
||||||
|
@ -81,6 +81,13 @@ TEST_F(AliasAnalysisTest, getModRefInfo) {
|
|||||||
auto *Store1 = new StoreInst(Value, Addr, BB);
|
auto *Store1 = new StoreInst(Value, Addr, BB);
|
||||||
auto *Load1 = new LoadInst(Addr, "load", BB);
|
auto *Load1 = new LoadInst(Addr, "load", BB);
|
||||||
auto *Add1 = BinaryOperator::CreateAdd(Value, Value, "add", BB);
|
auto *Add1 = BinaryOperator::CreateAdd(Value, Value, "add", BB);
|
||||||
|
auto *VAArg1 = new VAArgInst(Addr, PtrType, "vaarg", BB);
|
||||||
|
auto *CmpXChg1 = new AtomicCmpXchgInst(Addr, ConstantInt::get(IntType, 0),
|
||||||
|
ConstantInt::get(IntType, 1),
|
||||||
|
Monotonic, Monotonic, CrossThread, BB);
|
||||||
|
auto *AtomicRMW =
|
||||||
|
new AtomicRMWInst(AtomicRMWInst::Xchg, Addr, ConstantInt::get(IntType, 1),
|
||||||
|
Monotonic, CrossThread, BB);
|
||||||
|
|
||||||
ReturnInst::Create(C, nullptr, BB);
|
ReturnInst::Create(C, nullptr, BB);
|
||||||
|
|
||||||
@ -88,6 +95,9 @@ TEST_F(AliasAnalysisTest, getModRefInfo) {
|
|||||||
CheckModRef(Store1, AliasAnalysis::ModRefResult::Mod);
|
CheckModRef(Store1, AliasAnalysis::ModRefResult::Mod);
|
||||||
CheckModRef(Load1, AliasAnalysis::ModRefResult::Ref);
|
CheckModRef(Load1, AliasAnalysis::ModRefResult::Ref);
|
||||||
CheckModRef(Add1, AliasAnalysis::ModRefResult::NoModRef);
|
CheckModRef(Add1, AliasAnalysis::ModRefResult::NoModRef);
|
||||||
|
CheckModRef(VAArg1, AliasAnalysis::ModRefResult::ModRef);
|
||||||
|
CheckModRef(CmpXChg1, AliasAnalysis::ModRefResult::ModRef);
|
||||||
|
CheckModRef(AtomicRMW, AliasAnalysis::ModRefResult::ModRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end anonymous namspace
|
} // end anonymous namspace
|
||||||
|
Loading…
Reference in New Issue
Block a user