summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-07-14 01:06:29 +0000
committerDan Gohman <gohman@apple.com>2009-07-14 01:06:29 +0000
commita342026504e65e2c8dc5600dab4b45ab4f94026d (patch)
tree418fea323a04472d98a8cb8c7217ce2b9430ea43 /include
parentb9e126ce7de05d580d9eb3b664487dab07304939 (diff)
downloadllvm-a342026504e65e2c8dc5600dab4b45ab4f94026d.tar.gz
llvm-a342026504e65e2c8dc5600dab4b45ab4f94026d.tar.bz2
llvm-a342026504e65e2c8dc5600dab4b45ab4f94026d.tar.xz
Introduce a new LoopInfo utility function makeLoopInvariant, which
works similar to isLoopInvariant, except that it will do trivial hoisting to try to make the value loop invariant if it isn't already. This makes it easier for transformation passes to clear trivial instructions out of the way (the regular LICM pass doesn't run until relatively late). This is code factored out of LoopSimplify and other places. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75578 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Analysis/LoopInfo.h27
1 files changed, 27 insertions, 0 deletions
diff --git a/include/llvm/Analysis/LoopInfo.h b/include/llvm/Analysis/LoopInfo.h
index 2bed04b3b2..90afc01da0 100644
--- a/include/llvm/Analysis/LoopInfo.h
+++ b/include/llvm/Analysis/LoopInfo.h
@@ -476,6 +476,33 @@ public:
///
bool isLoopInvariant(Value *V) const;
+ /// isLoopInvariant - Return true if the specified instruction is
+ /// loop-invariant.
+ ///
+ bool isLoopInvariant(Instruction *I) const;
+
+ /// makeLoopInvariant - If the given value is an instruciton inside of the
+ /// loop and it can be hoisted, do so to make it trivially loop-invariant.
+ /// Return true if the value after any hoisting is loop invariant. This
+ /// function can be used as a slightly more aggressive replacement for
+ /// isLoopInvariant.
+ ///
+ /// If InsertPt is specified, it is the point to hoist instructions to.
+ /// If null, the terminator of the loop preheader is used.
+ ///
+ bool makeLoopInvariant(Value *V, Instruction *InsertPt = 0) const;
+
+ /// makeLoopInvariant - If the given instruction is inside of the
+ /// loop and it can be hoisted, do so to make it trivially loop-invariant.
+ /// Return true if the instruction after any hoisting is loop invariant. This
+ /// function can be used as a slightly more aggressive replacement for
+ /// isLoopInvariant.
+ ///
+ /// If InsertPt is specified, it is the point to hoist instructions to.
+ /// If null, the terminator of the loop preheader is used.
+ ///
+ bool makeLoopInvariant(Instruction *I, Instruction *InsertPt = 0) const;
+
/// getCanonicalInductionVariable - Check to see if the loop has a canonical
/// induction variable: an integer recurrence that starts at 0 and increments
/// by one each time through the loop. If so, return the phi node that