OSDN Git Service

Reapply r237453 with a fix for the test timeouts.
authorJames Molloy <james.molloy@arm.com>
Sat, 16 May 2015 13:10:45 +0000 (13:10 +0000)
committerJames Molloy <james.molloy@arm.com>
Sat, 16 May 2015 13:10:45 +0000 (13:10 +0000)
commitbc71c2fd8ec127040465ec939353cf417b5959cc
tree5d6b723ad8bad27d825772071a6f3a6e9576d049
parentf01f1c413a7aa03a241d90439e68620bb75abee4
Reapply r237453 with a fix for the test timeouts.

The test timeouts were due to instcombine fighting itself. Regression test added.
Original log message:

Canonicalize min/max expressions correctly.

This patch introduces a canonical form for min/max idioms where one operand
is extended or truncated. This often happens when the other operand is a
constant. For example:

  %1 = icmp slt i32 %a, i32 0
    %2 = sext i32 %a to i64
      %3 = select i1 %1, i64 %2, i64 0

Would now be canonicalized into:

  %1 = icmp slt i32 %a, i32 0
    %2 = select i1 %1, i32 %a, i32 0
      %3 = sext i32 %2 to i64

This builds upon a patch posted by David Majenemer
(https://www.marc.info/?l=llvm-commits&m=143008038714141&w=2). That pass
passively stopped instcombine from ruining canonical patterns. This
patch additionally actively makes instcombine canonicalize too.

Canonicalization of expressions involving a change in type from int->fp
or fp->int are not yet implemented.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237520 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/InstCombine/InstCombineCasts.cpp
lib/Transforms/InstCombine/InstCombineCompares.cpp
lib/Transforms/InstCombine/InstCombineSelect.cpp
lib/Transforms/InstCombine/InstructionCombining.cpp
test/Transforms/InstCombine/minmax-fold.ll [new file with mode: 0644]