OSDN Git Service

[X86] Improvement in CodeGen instruction selection for LEAs.
authorJatin Bhateja <jatin.bhateja@gmail.com>
Fri, 1 Dec 2017 14:07:38 +0000 (14:07 +0000)
committerJatin Bhateja <jatin.bhateja@gmail.com>
Fri, 1 Dec 2017 14:07:38 +0000 (14:07 +0000)
commitf5040aa4c6e23d7f5f8113e40e98427b46e51692
treedb207a44b6f6a6a612c7d62e3f5925ea659a4749
parent05349f09dbd2e9f4360f9169aa68a313610edfe4
[X86] Improvement in CodeGen instruction selection for LEAs.

Summary:
1/  Operand folding during complex pattern matching for LEAs has been extended, such that it promotes Scale to
     accommodate similar operand appearing in the DAG  e.g.
                 T1 = A + B
                 T2 = T1 + 10
                 T3 = T2 + A
    For above DAG rooted at T3, X86AddressMode will now look like
                Base = B , Index = A , Scale = 2 , Disp = 10

2/  During OptimizeLEAPass down the pipeline factorization is now performed over LEAs so that if there is an opportunity
     then complex LEAs (having 3 operands) could be factored out  e.g.
                 leal 1(%rax,%rcx,1), %rdx
                 leal 1(%rax,%rcx,2), %rcx
     will be factored as following
                 leal 1(%rax,%rcx,1), %rdx
                 leal (%rdx,%rcx)   , %edx

3/ Aggressive operand folding for AM based selection for LEAs is sensitive to loops, thus avoiding creation of any complex LEAs within a loop.

4/ Simplify LEA converts (lea (BASE,1,INDEX,0)  --> add (BASE, INDEX) which offers better through put.

PR32755 will be taken care of by this pathc.

Previous patch revisions : r313343 , r314886

Reviewers: lsaba, RKSimon, craig.topper, qcolombet, jmolloy, jbhateja

Reviewed By: lsaba, RKSimon, jbhateja

Subscribers: jmolloy, spatel, igorb, llvm-commits

Differential Revision: https://reviews.llvm.org/D35014

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319543 91177308-0d34-0410-b5e6-96231b3b80d8
18 files changed:
include/llvm/CodeGen/MachineInstr.h
include/llvm/CodeGen/SelectionDAG.h
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
lib/Target/X86/X86ISelDAGToDAG.cpp
lib/Target/X86/X86OptimizeLEAs.cpp
test/CodeGen/X86/GlobalISel/callingconv.ll
test/CodeGen/X86/GlobalISel/gep.ll
test/CodeGen/X86/GlobalISel/memop-scalar.ll
test/CodeGen/X86/lea-opt-cse1.ll
test/CodeGen/X86/lea-opt-cse2.ll
test/CodeGen/X86/lea-opt-cse3.ll
test/CodeGen/X86/lea-opt-cse4.ll
test/CodeGen/X86/mul-constant-i16.ll
test/CodeGen/X86/mul-constant-i32.ll
test/CodeGen/X86/mul-constant-i64.ll
test/CodeGen/X86/mul-constant-result.ll
test/CodeGen/X86/umul-with-overflow.ll
test/Transforms/LoopStrengthReduce/X86/ivchain-X86.ll