mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-26 22:26:16 +00:00
Check for volatile loads only once.
Implement load.ll:test7 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21645 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
45c2bdd2f9
commit
37366c1ba8
@ -4750,13 +4750,34 @@ static bool isSafeToLoadUnconditionally(Value *V, Instruction *ScanFrom) {
|
||||
Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
||||
Value *Op = LI.getOperand(0);
|
||||
|
||||
// load (cast X) --> cast (load X) iff safe
|
||||
if (CastInst *CI = dyn_cast<CastInst>(Op))
|
||||
if (Instruction *Res = InstCombineLoadCast(*this, LI))
|
||||
return Res;
|
||||
|
||||
// None of the following transforms are legal for volatile loads.
|
||||
if (LI.isVolatile()) return 0;
|
||||
|
||||
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op))
|
||||
if (isa<ConstantPointerNull>(GEPI->getOperand(0)) ||
|
||||
isa<UndefValue>(GEPI->getOperand(0))) {
|
||||
// Insert a new store to null instruction before the load to indicate
|
||||
// that this code is not reachable. We do this instead of inserting
|
||||
// an unreachable instruction directly because we cannot modify the
|
||||
// CFG.
|
||||
new StoreInst(UndefValue::get(LI.getType()),
|
||||
Constant::getNullValue(Op->getType()), &LI);
|
||||
return ReplaceInstUsesWith(LI, UndefValue::get(LI.getType()));
|
||||
}
|
||||
|
||||
if (Constant *C = dyn_cast<Constant>(Op)) {
|
||||
if ((C->isNullValue() || isa<UndefValue>(C)) &&
|
||||
!LI.isVolatile()) { // load null/undef -> undef
|
||||
// load null/undef -> undef
|
||||
if ((C->isNullValue() || isa<UndefValue>(C))) {
|
||||
// Insert a new store to null instruction before the load to indicate that
|
||||
// this code is not reachable. We do this instead of inserting an
|
||||
// unreachable instruction directly because we cannot modify the CFG.
|
||||
new StoreInst(UndefValue::get(LI.getType()), C, &LI);
|
||||
new StoreInst(UndefValue::get(LI.getType()),
|
||||
Constant::getNullValue(Op->getType()), &LI);
|
||||
return ReplaceInstUsesWith(LI, UndefValue::get(LI.getType()));
|
||||
}
|
||||
|
||||
@ -4772,18 +4793,23 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
||||
if (GV->isConstant() && !GV->isExternal())
|
||||
if (Constant *V = GetGEPGlobalInitializer(GV->getInitializer(), CE))
|
||||
return ReplaceInstUsesWith(LI, V);
|
||||
if (CE->getOperand(0)->isNullValue()) {
|
||||
// Insert a new store to null instruction before the load to indicate
|
||||
// that this code is not reachable. We do this instead of inserting
|
||||
// an unreachable instruction directly because we cannot modify the
|
||||
// CFG.
|
||||
new StoreInst(UndefValue::get(LI.getType()),
|
||||
Constant::getNullValue(Op->getType()), &LI);
|
||||
return ReplaceInstUsesWith(LI, UndefValue::get(LI.getType()));
|
||||
}
|
||||
|
||||
} else if (CE->getOpcode() == Instruction::Cast) {
|
||||
if (Instruction *Res = InstCombineLoadCast(*this, LI))
|
||||
return Res;
|
||||
}
|
||||
}
|
||||
|
||||
// load (cast X) --> cast (load X) iff safe
|
||||
if (CastInst *CI = dyn_cast<CastInst>(Op))
|
||||
if (Instruction *Res = InstCombineLoadCast(*this, LI))
|
||||
return Res;
|
||||
|
||||
if (!LI.isVolatile() && Op->hasOneUse()) {
|
||||
if (Op->hasOneUse()) {
|
||||
// Change select and PHI nodes to select values instead of addresses: this
|
||||
// helps alias analysis out a lot, allows many others simplifications, and
|
||||
// exposes redundancy in the code.
|
||||
|
Loading…
Reference in New Issue
Block a user