|  | Commit message (Collapse) | Author | Age | Files | Lines | 
|---|
| | 
| 
| 
| | llvm-svn: 70427 | 
| | 
| 
| 
| | llvm-svn: 70416 | 
| | 
| 
| 
| | llvm-svn: 70262 | 
| | 
| 
| 
| | llvm-svn: 70247 | 
| | 
| 
| 
| 
| 
| 
| | between the comparison's iv stride and the candidate stride is
exactly -1.
llvm-svn: 70244 | 
| | 
| 
| 
| | llvm-svn: 70054 | 
| | 
| 
| 
| 
| 
| 
| | into unsigned ones when the operands are known to have the same
sign bit value.
llvm-svn: 70053 | 
| | 
| 
| 
| | llvm-svn: 69946 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | with the persistent insertion point, and change IndVars to make
use of it. This fixes a bug where IndVars was holding on to a
stale insertion point and forcing the SCEVExpander to continue to
use it.
This fixes PR4038.
llvm-svn: 69892 | 
| | 
| 
| 
| | llvm-svn: 69844 | 
| | 
| 
| 
| | llvm-svn: 69842 | 
| | 
| 
| 
| | llvm-svn: 69836 | 
| | 
| 
| 
| 
| 
| 
| 
| | the predecessors themselves.  This halves the time
to optimize the testcase, beyond what my previous patch did.
llvm-svn: 69792 | 
| | 
| 
| 
| 
| 
| | testcase from PR3549.  More improvements to come.
llvm-svn: 69788 | 
| | 
| 
| 
| | llvm-svn: 69752 | 
| | 
| 
| 
| | llvm-svn: 69680 | 
| | 
| 
| 
| 
| 
| | and SCEVSignExtendExpr.
llvm-svn: 69649 | 
| | 
| 
| 
| 
| 
| | the code to minimize dependencies on TargetData.
llvm-svn: 69644 | 
| | 
| 
| 
| 
| 
| | GEP's don't usually become instructions.
llvm-svn: 69631 | 
| | 
| 
| 
| 
| 
| | pointer type, make sure that the pointer size is a valid sequential index type.
llvm-svn: 69574 | 
| | 
| 
| 
| | llvm-svn: 69450 | 
| | 
| 
| 
| | llvm-svn: 69402 | 
| | 
| 
| 
| 
| 
| | This fixes a --enable-expensive-checks problem.
llvm-svn: 69353 | 
| | 
| 
| 
| 
| 
| 
| | regression in 403.gcc in PIC_CODEGEN=1 and DISABLE_LTO=1
mode.
llvm-svn: 69344 | 
| | 
| 
| 
| 
| 
| | to get the correct answer for pointer types.
llvm-svn: 69321 | 
| | 
| 
| 
| 
| 
| | incoming edges for a block with many predecessors.
llvm-svn: 69312 | 
| | 
| 
| 
| 
| 
| 
| | targets with pointers larger than 64 bits, due to the code not
yet being APInt clean.
llvm-svn: 69296 | 
| | 
| 
| 
| 
| 
| | optimizer, which just happen to frequently involve optimizing GEPs.
llvm-svn: 69295 | 
| | 
| 
| 
| 
| 
| | since the operand is always a constant.
llvm-svn: 69291 | 
| | 
| 
| 
| 
| 
| | new instruction with SCEVExpander::InsertCastOfTo.
llvm-svn: 69290 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | have pointer types, though in contrast to C pointer types, SCEV
addition is never implicitly scaled. This not only eliminates the
need for special code like IndVars' EliminatePointerRecurrence
and LSR's own GEP expansion code, it also does a better job because
it lets the normal optimizations handle pointer expressions just
like integer expressions.
Also, since LLVM IR GEPs can't directly index into multi-dimensional
VLAs, moving the GEP analysis out of client code and into the SCEV
framework makes it easier for clients to handle multi-dimensional
VLAs the same way as other arrays.
Some existing regression tests show improved optimization.
test/CodeGen/ARM/2007-03-13-InstrSched.ll in particular improved to
the point where if-conversion started kicking in; I turned it off
for this test to preserve the intent of the test.
llvm-svn: 69258 | 
| | 
| 
| 
| 
| 
| 
| 
| | and sext over (iv | const), if a longer iv is
available.  Allow expressions to have more than
one zext/sext parent.  All from OpenSSL.
llvm-svn: 69241 | 
| | 
| 
| 
| 
| 
| 
| | if a longer iv is available.  These subscript forms are
not common; they're a bottleneck in OpenSSL.
llvm-svn: 69215 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| | sext around sext(shorter IV + constant), using a
longer IV instead, when it can figure out the
add can't overflow.  This comes up a lot in
subscripting; mainly affects 64 bit.
llvm-svn: 69123 | 
| | 
| 
| 
| 
| 
| | destinations have phi nodes.
llvm-svn: 69121 | 
| | 
| 
| 
| 
| 
| | llvm.dbg.region.end instrinsic. This nested llvm.dbg.func.start/llvm.dbg.region.end pair now enables DW_TAG_inlined_subroutine support in code generator.
llvm-svn: 69118 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | This turns:
eq:
        %3 = icmp eq i32 %1, %2
        br label %join
ne:
        %4 = icmp ne i32 %1, %2
        br label %join
join:
        %5 = phi i1 [%3, %eq], [%4, %ne]
        br i1 %5, label %yes, label %no
=>
eq:
        %3 = icmp eq i32 %1, %2
        br i1 %3, label %yes, label %no
ne:
        %4 = icmp ne i32 %1, %2
        br i1 %4, label %yes, label %no
llvm-svn: 69102 | 
| | 
| 
| 
| 
| 
| | deleting, not just the basic block.
llvm-svn: 69011 | 
| | 
| 
| 
| | llvm-svn: 68939 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | strncat :(
strncat(foo, "bar", 99)
would be optimized to
memcpy(foo+strlen(foo), "bar", 100, 1)
instead of
memcpy(foo+strlen(foo), "bar", 4, 1)"
Patch by Benjamin Kramer!
llvm-svn: 68905 | 
| | 
| 
| 
| 
| 
| | code.  Patch by Benjamin Kramer!
llvm-svn: 68885 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | integer types, unless they are already strange.  This prevents it from
turning the code produced by SROA into crazy libcalls and stuff that 
the code generator can't handle.  In the attached example, the result
was an i96 multiply that caused the x86 backend to assert.
Note that if TargetData had an idea of what the legal types are for
a target that this could be used to stop instcombine from introducing
i64 muls, as Scott wanted.
llvm-svn: 68598 | 
| | 
| 
| 
| | llvm-svn: 68500 | 
| | 
| 
| 
| | llvm-svn: 68485 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| | instead of the place where it started to perform the string copy.
- PR3661
- Patch by Benjamin Kramer!
llvm-svn: 68443 | 
| | 
| 
| 
| | llvm-svn: 68262 | 
| | 
| 
| 
| 
| 
| 
| 
| | Applications/Burg/burg
  Applications/ClamAV/clamscan
and many other tests.
llvm-svn: 68211 | 
| | 
| 
| 
| | llvm-svn: 68172 | 
| | 
| 
| 
| 
| 
| | if it dangles.
llvm-svn: 68150 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | not generate selects of two constants unless they are selects of 0 and 1.
e.g.
define i32 @t1(i32 %c, i32 %x) nounwind {
       %t1 = icmp eq i32 %c, 0
       %t2 = lshr i32 %x, 18
       %t3 = select i1 %t1, i32 %t2, i32 %x
       ret i32 %t3
}
was turned into
define i32 @t2(i32 %c, i32 %x) nounwind {
       %t1 = icmp eq i32 %c, 0
       %t2 = select i1 %t1, i32 18, i32 0
       %t3 = lshr i32 %x, %t2
       ret i32 %t3
}
For most targets, that means materializing two constants and then a select. e.g. On x86-64
movl    %esi, %eax
shrl    $18, %eax
testl   %edi, %edi
cmovne  %esi, %eax
ret
=>
xorl    %eax, %eax
testl   %edi, %edi
movl    $18, %ecx
cmovne  %eax, %ecx
movl    %esi, %eax
shrl    %cl, %eax
ret
Also, the optimizer and codegen can reason about shl / and / add, etc. by a constant. This optimization will hinder optimizations using ComputeMaskedBits.
llvm-svn: 68142 |