Canonicalize min/max expressions correctly.
commit49f69b8e2513815789c52cfd8d2ba095de5a59af
authorJames Molloy <james.molloy@arm.com>
Fri, 15 May 2015 16:10:59 +0000 (15 16:10 +0000)
committerJames Molloy <james.molloy@arm.com>
Fri, 15 May 2015 16:10:59 +0000 (15 16:10 +0000)
tree538c506c4043b110c79dfe86a12c429c7ecb9541
parenteb9033d963e97c83b964c5ee75bf39b996cb5d20
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@237453 91177308-0d34-0410-b5e6-96231b3b80d8
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]