From: Chris Lattner Date: Sun, 1 May 2005 04:24:53 +0000 (+0000) Subject: Check for volatile loads only once. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=37366c1ba8e672eb5a045f999e322bc5b93f867f;p=oota-llvm.git 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 --- diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index c901b1a45e8..6b958f2c77f 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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(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(Op)) + if (isa(GEPI->getOperand(0)) || + isa(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(Op)) { - if ((C->isNullValue() || isa(C)) && - !LI.isVolatile()) { // load null/undef -> undef + // load null/undef -> undef + if ((C->isNullValue() || isa(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(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.