aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-10-01 18:12:58 +0000
committerDevang Patel <dpatel@apple.com>2007-10-01 18:12:58 +0000
commit7756e346e662b7d64764762f74ed05ca035676c1 (patch)
tree5faecbad434a086529a7155f246832e73b824993 /lib/Transforms
parentf37bf455a2375a07a3ae19528630e6986084200a (diff)
downloadexternal_llvm-7756e346e662b7d64764762f74ed05ca035676c1.zip
external_llvm-7756e346e662b7d64764762f74ed05ca035676c1.tar.gz
external_llvm-7756e346e662b7d64764762f74ed05ca035676c1.tar.bz2
Relax unsafe use check. If there is one unconditional use inside the loop then it is safe to promote value even if there is another conditional use inside the loop.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42493 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/LICM.cpp44
1 files changed, 22 insertions, 22 deletions
diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp
index e461c88..e795aa9 100644
--- a/lib/Transforms/Scalar/LICM.cpp
+++ b/lib/Transforms/Scalar/LICM.cpp
@@ -800,24 +800,15 @@ void LICM::FindPromotableValuesInLoop(
break;
}
- // Do not promote null values because it may be unsafe to do so.
- if (isa<ConstantPointerNull>(V))
- PointerOk = false;
-
- if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(V)) {
- // If GEP base is NULL then the calculated address used by Store or
- // Load instruction is invalid. Do not promote this value because
- // it may expose load and store instruction that are covered by
- // condition which may not yet folded.
- if (isa<ConstantPointerNull>(GEP->getOperand(0)))
- PointerOk = false;
- }
-
- // If value V use is not dominating loop exit then promoting
- // it may expose unsafe load and store instructions unconditinally.
- if (PointerOk)
+ // If one use of value V inside the loop is safe then it is OK to promote
+ // this value. On the otherside if there is not any unsafe use inside the
+ // looop then also it is OK to promote this value. Otherwise it is
+ // unsafe to promote this value.
+ if (PointerOk) {
+ bool oneSafeUse = false;
+ bool oneUnsafeUse = false;
for(Value::use_iterator UI = V->use_begin(), UE = V->use_end();
- UI != UE && PointerOk; ++UI) {
+ UI != UE; ++UI) {
Instruction *Use = dyn_cast<Instruction>(*UI);
if (!Use || !CurLoop->contains(Use->getParent()))
continue;
@@ -825,16 +816,25 @@ void LICM::FindPromotableValuesInLoop(
ExitI = LoopExits.begin(), ExitE = LoopExits.end();
ExitI != ExitE; ++ExitI) {
Instruction *Ex = *ExitI;
- if (!DT->dominates(Use, Ex)){
- PointerOk = false;
+ if (!isa<PHINode>(Use) && DT->dominates(Use, Ex)) {
+ oneSafeUse = true;
break;
}
+ else
+ oneUnsafeUse = true;
}
-
- if (!PointerOk)
+
+ if (oneSafeUse)
break;
}
-
+
+ if (oneSafeUse)
+ PointerOk = true;
+ else if (!oneUnsafeUse)
+ PointerOk = true;
+ else
+ PointerOk = false;
+ }
if (PointerOk) {
const Type *Ty = cast<PointerType>(V->getType())->getElementType();