Expand GEPs in ScalarEvolution expressions. SCEV expressions can now
authorDan Gohman <gohman@apple.com>
Thu, 16 Apr 2009 03:18:22 +0000 (03:18 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 16 Apr 2009 03:18:22 +0000 (03:18 +0000)
commit2d1be87ee40a4a0241d94448173879d9df2bc5b3
treefa16eff022c8808a5eb6aedb159ea653af0faae9
parent9efac568f08de669c8e0003b33b80998cedaf8b6
Expand GEPs in ScalarEvolution expressions. SCEV expressions can now
have pointer types, though in contrast to C pointer types, SCEV
addition is never implicitly scaled. This not only eliminates the
need for special code like IndVars' EliminatePointerRecurrence
and LSR's own GEP expansion code, it also does a better job because
it lets the normal optimizations handle pointer expressions just
like integer expressions.

Also, since LLVM IR GEPs can't directly index into multi-dimensional
VLAs, moving the GEP analysis out of client code and into the SCEV
framework makes it easier for clients to handle multi-dimensional
VLAs the same way as other arrays.

Some existing regression tests show improved optimization.
test/CodeGen/ARM/2007-03-13-InstrSched.ll in particular improved to
the point where if-conversion started kicking in; I turned it off
for this test to preserve the intent of the test.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69258 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Analysis/ScalarEvolution.h
include/llvm/Analysis/ScalarEvolutionExpander.h
lib/Analysis/ScalarEvolution.cpp
lib/Analysis/ScalarEvolutionExpander.cpp
lib/Transforms/Scalar/IndVarSimplify.cpp
lib/Transforms/Scalar/LoopStrengthReduce.cpp
test/CodeGen/ARM/2007-03-13-InstrSched.ll
test/CodeGen/X86/iv-users-in-other-loops.ll
test/CodeGen/X86/pr3495.ll
test/CodeGen/X86/stride-nine-with-base-reg.ll