Teach instsimplify how to constant fold pointer differences.
authorChandler Carruth <chandlerc@gmail.com>
Mon, 12 Mar 2012 11:19:31 +0000 (11:19 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 12 Mar 2012 11:19:31 +0000 (11:19 +0000)
commitfc72ae613afd7ca2526bb66156bafe8b0054cb3b
treec25757bf86fcac9b4b369729c274ef0be0e682ba
parent747cccf0dc345ab63894ce498233868cf110b717
Teach instsimplify how to constant fold pointer differences.

Typically instcombine has handled this, but pointer differences show up
in several contexts where we would like to get constant folding, and
cannot afford to run instcombine. Specifically, I'm working on improving
the constant folding of arguments used in inline cost analysis with
instsimplify.

Doing this in instsimplify implies some algorithm changes. We have to
handle multiple layers of all-constant GEPs because instsimplify cannot
fold them into a single GEP the way instcombine can. Also, we're only
interested in all-constant GEPs. The result is that this doesn't really
replace the instcombine logic, it's just complimentary and focused on
constant folding.

Reviewed on IRC by Benjamin Kramer.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152555 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/ptr_diff.ll [new file with mode: 0644]