llvm-6502/lib/Transforms/InstCombine
Jakob Stoklund Olesen 0d5fcae6cd Defer some shl transforms to DAGCombine.
The shl instruction is used to represent multiplication by a constant
power of two as well as bitwise left shifts. Some InstCombine
transformations would turn an shl instruction into a bit mask operation,
making it difficult for later analysis passes to recognize the
constsnt multiplication.

Disable those shl transformations, deferring them to DAGCombine time.
An 'shl X, C' instruction is now treated mostly the same was as 'mul X, C'.

These transformations are deferred:

  (X >>? C) << C   --> X & (-1 << C)  (When X >> C has multiple uses)
  (X >>? C1) << C2 --> X << (C2-C1) & (-1 << C2)   (When C2 > C1)
  (X >>? C1) << C2 --> X >>? (C1-C2) & (-1 << C2)  (When C1 > C2)

The corresponding exact transformations are preserved, just like
div-exact + mul:

  (X >>?,exact C) << C   --> X
  (X >>?,exact C1) << C2 --> X << (C2-C1)
  (X >>?,exact C1) << C2 --> X >>?,exact (C1-C2)

The disabled transformations could also prevent the instruction selector
from recognizing rotate patterns in hash functions and cryptographic
primitives. I have a test case for that, but it is too fragile.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155136 91177308-0d34-0410-b5e6-96231b3b80d8
2012-04-19 16:46:26 +00:00
..
CMakeLists.txt build/CMake: Finish removal of add_llvm_library_dependencies. 2011-11-29 19:25:30 +00:00
InstCombine.h Always compute all the bits in ComputeMaskedBits. 2012-04-04 12:51:34 +00:00
InstCombineAddSub.cpp Always compute all the bits in ComputeMaskedBits. 2012-04-04 12:51:34 +00:00
InstCombineAndOrXor.cpp eliminate an unneeded branch, part of PR12357 2012-03-26 19:13:57 +00:00
InstCombineCalls.cpp Always compute all the bits in ComputeMaskedBits. 2012-04-04 12:51:34 +00:00
InstCombineCasts.cpp Always compute all the bits in ComputeMaskedBits. 2012-04-04 12:51:34 +00:00
InstCombineCompares.cpp Always compute all the bits in ComputeMaskedBits. 2012-04-04 12:51:34 +00:00
InstCombineLoadStoreAlloca.cpp Teach InstCombine to nuke a common alloca pattern -- an alloca which has 2012-04-08 14:36:56 +00:00
InstCombineMulDivRem.cpp Remove some dead code and tidy things up now that vectors use ConstantDataVector 2012-02-06 21:56:39 +00:00
InstCombinePHI.cpp Update instcombine for atomic load/store. 2011-08-15 22:09:40 +00:00
InstCombineSelect.cpp More dead code removal (using -Wunreachable-code) 2012-01-20 21:51:11 +00:00
InstCombineShifts.cpp Defer some shl transforms to DAGCombine. 2012-04-19 16:46:26 +00:00
InstCombineSimplifyDemanded.cpp Always compute all the bits in ComputeMaskedBits. 2012-04-04 12:51:34 +00:00
InstCombineVectorOps.cpp continue making the world safe for ConstantDataVector. At this point, 2012-01-27 03:08:05 +00:00
InstCombineWorklist.h Use an iterator instead of calling .size() on the worklist every time, which is wasteful. 2012-03-15 11:19:41 +00:00
InstructionCombining.cpp 153465 was incorrect. In this code we wanted to check that the pointer operand is of pointer type (and not vector type). 2012-03-26 21:00:53 +00:00
LLVMBuild.txt LLVMBuild: Remove trailing newline, which irked me. 2011-12-12 19:48:00 +00:00
Makefile