Teach IndVarSimplify to optimize code using the C "int" type for
authorDan Gohman <gohman@apple.com>
Thu, 12 Feb 2009 22:19:27 +0000 (22:19 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 12 Feb 2009 22:19:27 +0000 (22:19 +0000)
commitc2390b14c91764cba6e4394d05e58e387a7dfb19
tree50928112e772fb856a2eada26c52ca9010bd2b53
parent0f123cf732ad249117b7471e37bf819633b76a6e
Teach IndVarSimplify to optimize code using the C "int" type for
loop induction on LP64 targets. When the induction variable is
used in addressing, IndVars now is usually able to inserst a
64-bit induction variable and eliminates the sign-extending cast.
This is also useful for code using C "short" types for
induction variables on targets with 32-bit addressing.

Inserting a wider induction variable is easy; the tricky part is
determining when trunc(sext(i)) expressions are no-ops. This
requires range analysis of the loop trip count. A common case is
when the original loop iteration starts at 0 and exits when the
induction variable is signed-less-than a fixed value; this case
is now handled.

This replaces IndVarSimplify's OptimizeCanonicalIVType. It was
doing the same optimization, but it was limited to loops with
constant trip counts, because it was running after the loop
rewrite, and the information about the original induction
variable is lost by that point.

Rename ScalarEvolution's executesAtLeastOnce to
isLoopGuardedByCond, generalize it to be able to test for
ICMP_NE conditions, and move it to be a public function so that
IndVars can use it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64407 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Analysis/ScalarEvolution.h
lib/Analysis/ScalarEvolution.cpp
lib/Transforms/Scalar/IndVarSimplify.cpp
test/Transforms/IndVarsSimplify/promote-iv-to-eliminate-casts.ll [new file with mode: 0644]