From cfa597569d79a8b53cc4faa9725a66e246a19866 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 25 Nov 2007 21:27:53 +0000 Subject: [PATCH] Implement PR1822 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44318 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InstructionCombining.cpp | 7 +++++++ test/Transforms/InstCombine/select.ll | 14 +++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 85fd2c3bdb7..e90d1909ae4 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -7326,6 +7326,13 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { return BinaryOperator::createOr(NotCond, TrueVal); } } + + // select a, b, a -> a&b + // select a, a, b -> a|b + if (CondVal == TrueVal) + return BinaryOperator::createOr(CondVal, FalseVal); + else if (CondVal == FalseVal) + return BinaryOperator::createAnd(CondVal, TrueVal); } // Selecting between two integer constants? diff --git a/test/Transforms/InstCombine/select.ll b/test/Transforms/InstCombine/select.ll index ccc63c2553d..aac7603e082 100644 --- a/test/Transforms/InstCombine/select.ll +++ b/test/Transforms/InstCombine/select.ll @@ -1,8 +1,7 @@ ; This test makes sure that these instructions are properly eliminated. +; PR1822 -; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ -; RUN: not grep select -; END. +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep select implementation @@ -180,3 +179,12 @@ short %test22(int %x) { ret short %retval } +bool %test23(bool %a, bool %b) { + %c = select bool %a, bool %b, bool %a + ret bool %c +} + +bool %test24(bool %a, bool %b) { + %c = select bool %a, bool %a, bool %b + ret bool %c +} -- 2.34.1