[InstCombine] try to fold (select C, (sext A), B) into logical ops
authorNicolai Haehnle <nhaehnle@gmail.com>
Fri, 5 Aug 2016 08:22:29 +0000 (08:22 +0000)
committerNicolai Haehnle <nhaehnle@gmail.com>
Fri, 5 Aug 2016 08:22:29 +0000 (08:22 +0000)
commit870bf1788ca95986dacf4a1b56bbc2cf7127c230
tree8718955a31f170b1a2bcb487251e72db633be5bf
parent470608e3e48af598513f36107e36a555a1966e75
[InstCombine] try to fold (select C, (sext A), B) into logical ops

Summary:
Turn (select C, (sext A), B) into (sext (select C, A, B')) when A is i1 and
B is a compatible constant, also for zext instead of sext. This will then be
further folded into logical operations.

The transformation would be valid for non-i1 types as well, but other parts of
InstCombine prefer to have sext from non-i1 as an operand of select.

Motivated by the shader compiler frontend in Mesa for AMDGPU, which emits i32
for boolean operations. With this change, the boolean logic is fully
recovered.

Reviewers: majnemer, spatel, tstellarAMD

Subscribers: llvm-commits

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

llvm-svn: 277801
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/test/Transforms/InstCombine/select-bitext.ll
llvm/test/Transforms/InstCombine/vector-casts.ll