Make Value::isDereferenceablePointer handle offsets to pointer types with dereference...
authorHal Finkel <hfinkel@anl.gov>
Sat, 19 Jul 2014 03:25:16 +0000 (03:25 +0000)
committerHal Finkel <hfinkel@anl.gov>
Sat, 19 Jul 2014 03:25:16 +0000 (03:25 +0000)
commit7c11695a233a27ff8124b4e276e5e95e74b3568d
treea05d5575e20b33a67a0284ea2eec9b7ae34afd76
parentb0a5225e6fb1c84a3e2dbdee1d94fb47730c3e01
Make Value::isDereferenceablePointer handle offsets to pointer types with dereferenceable attributes

When we have a parameter (or call site return) with a dereferenceable
attribute, it can specify the size of an array pointed to by that parameter. If
we have a value for which we can accumulate a constant offset to such a
parameter, then we can use that offset in a direct comparison with the size
specified by the dereferenceable attribute.

This enables us to handle cases like this:

  int foo(int a[static 3]) {
    return a[2]; /* this is always dereferenceable */
  }

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213447 91177308-0d34-0410-b5e6-96231b3b80d8
lib/IR/Value.cpp
test/Transforms/LICM/hoist-deref-load.ll