Reapply r237539 with a fix for the Chromium build.
authorJames Molloy <james.molloy@arm.com>
Wed, 20 May 2015 18:41:25 +0000 (18:41 +0000)
committerJames Molloy <james.molloy@arm.com>
Wed, 20 May 2015 18:41:25 +0000 (18:41 +0000)
commitd594ba081506f0f57e9801e3f81467b1766b1e04
treec76b62b84e2bd4f32980a6d5e16b9c8683fb9112
parentee15f8642147fc3945dd211f58814a9446e2a5f4
Reapply r237539 with a fix for the Chromium build.

Make sure if we're truncating a constant that would then be sign extended
that the sign extension of the truncated constant is the same as the
original constant.

> 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@237821 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/ValueTracking.cpp
lib/Transforms/InstCombine/InstCombineCasts.cpp
lib/Transforms/InstCombine/InstCombineCompares.cpp
lib/Transforms/InstCombine/InstCombineSelect.cpp
lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
lib/Transforms/InstCombine/InstructionCombining.cpp
test/Transforms/InstCombine/minmax-fold.ll [new file with mode: 0644]