llvm-project/llvm/test/Analysis/Delinearization
Jingyue Wu 42f1d67a45 [SCEV] Apply NSW and NUW flags via poison value analysis
Summary:
Make Scalar Evolution able to propagate NSW and NUW flags from instructions to SCEVs in some cases. This is based on reasoning about when poison from instructions with these flags would trigger undefined behavior. This gives a 13% speed-up on some Eigen3-based Google-internal microbenchmarks for NVPTX.

There does not seem to be clear agreement about when poison should be considered to propagate through instructions. In this analysis, poison propagates only in cases where that should be uncontroversial.

This change makes LSR able to create induction variables for expressions like &ptr[i + offset] for loops like this:

  for (int i = 0; i < limit; ++i) {
    sum += ptr[i + offset];
  }

Here ptr is a 64 bit pointer and offset is a 32 bit integer. For NVPTX, LSR currently creates an induction variable for i + offset instead, which is not as fast. Improving this situation is what brings the 13% speed-up on some Eigen3-based Google-internal microbenchmarks for NVPTX.


There are more details in this discussion on llvmdev.
June: http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-June/thread.html#87234
July: http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-July/thread.html#87392

Patch by Bjarke Roune

Reviewers: eliben, atrick, sanjoy

Subscribers: majnemer, hfinkel, jingyue, meheff, llvm-commits

Differential Revision: http://reviews.llvm.org/D11212

llvm-svn: 243460
2015-07-28 18:22:40 +00:00
..
a.ll Make DataLayout Non-Optional in the Module 2015-03-04 18:43:29 +00:00
divide_by_one.ll Recognize n/1 in the SCEV divide function 2015-04-20 16:03:28 +00:00
gcd_multiply_expr.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00
himeno_1.ll Make DataLayout Non-Optional in the Module 2015-03-04 18:43:29 +00:00
himeno_2.ll Make DataLayout Non-Optional in the Module 2015-03-04 18:43:29 +00:00
iv_times_constant_in_subscript.ll Make DataLayout Non-Optional in the Module 2015-03-04 18:43:29 +00:00
lit.local.cfg
multidim_ivs_and_integer_offsets_3d.ll [SCEV] Apply NSW and NUW flags via poison value analysis 2015-07-28 18:22:40 +00:00
multidim_ivs_and_integer_offsets_nts_3d.ll Make DataLayout Non-Optional in the Module 2015-03-04 18:43:29 +00:00
multidim_ivs_and_parameteric_offsets_3d.ll [SCEV] Apply NSW and NUW flags via poison value analysis 2015-07-28 18:22:40 +00:00
multidim_only_ivs_2d.ll Make DataLayout Non-Optional in the Module 2015-03-04 18:43:29 +00:00
multidim_only_ivs_2d_nested.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
multidim_only_ivs_3d.ll Make DataLayout Non-Optional in the Module 2015-03-04 18:43:29 +00:00
multidim_only_ivs_3d_cast.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
multidim_two_accesses_different_delinearization.ll [opaque pointer type] Add textual IR support for explicit type parameter to getelementptr instruction 2015-02-27 19:29:02 +00:00
type_mismatch.ll Fix a type mismatch assert in SCEV division 2015-04-22 15:06:40 +00:00
undef.ll [opaque pointer type] Add textual IR support for explicit type parameter to load instruction 2015-02-27 21:17:42 +00:00