llvm-6502/lib/Target/NVPTX
Jingyue Wu 2918efd551 Add straight-line strength reduction to LLVM
Summary:
Straight-line strength reduction (SLSR) is implemented in GCC but not yet in
LLVM. It has proven to effectively simplify statements derived from an unrolled
loop, and can potentially benefit many other cases too. For example,

LLVM unrolls

  #pragma unroll
  foo (int i = 0; i < 3; ++i) {
    sum += foo((b + i) * s);
  }

into

  sum += foo(b * s);
  sum += foo((b + 1) * s);
  sum += foo((b + 2) * s);

However, no optimizations yet reduce the internal redundancy of the three
expressions:

  b * s
  (b + 1) * s
  (b + 2) * s

With SLSR, LLVM can optimize these three expressions into:

  t1 = b * s
  t2 = t1 + s
  t3 = t2 + s

This commit is only an initial step towards implementing a series of such
optimizations. I will implement more (see TODO in the file commentary) in the
near future. This optimization is enabled for the NVPTX backend for now.
However, I am more than happy to push it to the standard optimization pipeline
after more thorough performance tests.

Test Plan: test/StraightLineStrengthReduce/slsr.ll

Reviewers: eliben, HaoLiu, meheff, hfinkel, jholewinski, atrick

Reviewed By: jholewinski, atrick

Subscribers: karthikthecool, jholewinski, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228016 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-03 19:37:06 +00:00
..
InstPrinter
MCTargetDesc
TargetInfo
cl_common_defines.h
CMakeLists.txt
LLVMBuild.txt
Makefile
ManagedStringPool.h
NVPTX.h [PM] Remove a bunch of stale TTI creation method declarations. I nuked 2015-02-01 00:22:15 +00:00
NVPTX.td
NVPTXAllocaHoisting.cpp
NVPTXAllocaHoisting.h
NVPTXAsmPrinter.cpp Remove usernames from TODOs, NFC 2015-02-03 17:57:38 +00:00
NVPTXAsmPrinter.h [NVPTX] Emit .pragma "nounroll" for loops marked with nounroll 2015-02-01 02:27:45 +00:00
NVPTXAssignValidGlobalNames.cpp [C++11] Add 'override' keywords and remove 'virtual'. Additionally add 'final' and leave 'virtual' on some methods that are marked virtual without overriding anything and have no obvious overrides themselves. NVPTX edition 2014-04-29 07:57:44 +00:00
NVPTXFavorNonGenericAddrSpaces.cpp
NVPTXFrameLowering.cpp
NVPTXFrameLowering.h Canonicalize header guards into a common format. 2014-08-13 16:26:38 +00:00
NVPTXGenericToNVVM.cpp
NVPTXImageOptimizer.cpp
NVPTXInstrFormats.td
NVPTXInstrInfo.cpp
NVPTXInstrInfo.h
NVPTXInstrInfo.td Migrate NVPTXISelDAGToDAG's getSubtarget to a runOnMachineFunction 2015-01-30 01:40:59 +00:00
NVPTXIntrinsics.td
NVPTXISelDAGToDAG.cpp Remove unused argument. 2015-01-30 01:41:01 +00:00
NVPTXISelDAGToDAG.h Migrate NVPTXISelDAGToDAG's getSubtarget to a runOnMachineFunction 2015-01-30 01:40:59 +00:00
NVPTXISelLowering.cpp Migrate NVPTXISelLowering to take the subtarget that it's dependent 2015-01-30 01:50:07 +00:00
NVPTXISelLowering.h Migrate NVPTXISelLowering to take the subtarget that it's dependent 2015-01-30 01:50:07 +00:00
NVPTXLowerAggrCopies.cpp
NVPTXLowerAggrCopies.h
NVPTXLowerStructArgs.cpp
NVPTXMachineFunctionInfo.h
NVPTXMCExpr.cpp
NVPTXMCExpr.h
NVPTXPrologEpilogPass.cpp Migrate a bare getSubtarget call to query the MachineFunction 2015-01-30 01:50:09 +00:00
NVPTXRegisterInfo.cpp
NVPTXRegisterInfo.h
NVPTXRegisterInfo.td
NVPTXReplaceImageHandles.cpp
NVPTXSection.h
NVPTXSubtarget.cpp Migrate NVPTXISelLowering to take the subtarget that it's dependent 2015-01-30 01:50:07 +00:00
NVPTXSubtarget.h
NVPTXTargetMachine.cpp Add straight-line strength reduction to LLVM 2015-02-03 19:37:06 +00:00
NVPTXTargetMachine.h [multiversion] Switch all of the targets over to use the 2015-02-01 13:20:00 +00:00
NVPTXTargetObjectFile.h
NVPTXTargetTransformInfo.cpp [PM] Switch the TargetMachine interface from accepting a pass manager 2015-01-31 11:17:59 +00:00
NVPTXTargetTransformInfo.h [multiversion] Switch the TTI queries from TargetMachine to Subtarget 2015-02-01 14:22:17 +00:00
NVPTXutil.cpp
NVPTXutil.h
NVPTXUtilities.cpp
NVPTXUtilities.h
NVPTXVector.td
NVVMReflect.cpp