[llvm-commits] [llvm] r124469 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineSelect.cpp test/Transforms/InstCombine/select.ll
Nick Lewycky
nicholas at mxc.ca
Thu Jan 27 19:28:10 PST 2011
Author: nicholas
Date: Thu Jan 27 21:28:10 2011
New Revision: 124469
URL: http://llvm.org/viewvc/llvm-project?rev=124469&view=rev
Log:
Fold select + select where both selects are on the same condition.
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/trunk/test/Transforms/InstCombine/select.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=124469&r1=124468&r2=124469&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Thu Jan 27 21:28:10 2011
@@ -792,6 +792,19 @@
if (Instruction *NV = FoldOpIntoPhi(SI))
return NV;
+ if (SelectInst *TrueSI = dyn_cast<SelectInst>(TrueVal)) {
+ if (TrueSI->getCondition() == CondVal) {
+ SI.setOperand(1, TrueSI->getTrueValue());
+ return &SI;
+ }
+ }
+ if (SelectInst *FalseSI = dyn_cast<SelectInst>(FalseVal)) {
+ if (FalseSI->getCondition() == CondVal) {
+ SI.setOperand(2, FalseSI->getFalseValue());
+ return &SI;
+ }
+ }
+
if (BinaryOperator::isNot(CondVal)) {
SI.setOperand(0, BinaryOperator::getNotArgument(CondVal));
SI.setOperand(1, FalseVal);
Modified: llvm/trunk/test/Transforms/InstCombine/select.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/select.ll?rev=124469&r1=124468&r2=124469&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/select.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/select.ll Thu Jan 27 21:28:10 2011
@@ -692,7 +692,7 @@
; PR8994
-; Theis select instruction can't be eliminated because trying to do so would
+; This select instruction can't be eliminated because trying to do so would
; change the number of vector elements. This used to assert.
define i48 @test51(<3 x i1> %icmp, <3 x i16> %tmp) {
%select = select <3 x i1> %icmp, <3 x i16> zeroinitializer, <3 x i16> %tmp
@@ -700,3 +700,18 @@
%tmp2 = bitcast <3 x i16> %select to i48
ret i48 %tmp2
}
+
+; PR8575
+
+ at g = common global i32 0, align 4
+define void @test52(i32 %n, i32 %m) nounwind {
+entry:
+ %cmp = icmp sgt i32 %n, %m
+ %. = select i1 %cmp, i32 1, i32 3
+ %add = add nsw i32 %., 3
+ %storemerge = select i1 %cmp, i32 %., i32 %add
+; CHECK: select i1 %cmp, i32 1, i32 6
+ store i32 %storemerge, i32* @g, align 4
+ ret void
+}
+
More information about the llvm-commits
mailing list