[llvm] r341666 - [InstCombine] Do not fold scalar ops over select with vector condition.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 7 07:40:06 PDT 2018
Author: fhahn
Date: Fri Sep 7 07:40:06 2018
New Revision: 341666
URL: http://llvm.org/viewvc/llvm-project?rev=341666&view=rev
Log:
[InstCombine] Do not fold scalar ops over select with vector condition.
If OtherOpT or OtherOpF have scalar types and the condition is a vector,
we would create an invalid select.
Reviewers: spatel, john.brawn, mssimpso, craig.topper
Reviewed By: spatel
Differential Revision: https://reviews.llvm.org/D51781
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/trunk/test/Transforms/InstCombine/select-gep.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=341666&r1=341665&r2=341666&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Fri Sep 7 07:40:06 2018
@@ -362,6 +362,14 @@ Instruction *InstCombiner::foldSelectOpO
return nullptr;
}
+ // If the select condition is a vector, the operands of the original select's
+ // operands also must be vectors. This may not be the case for getelementptr
+ // for example.
+ if (SI.getCondition()->getType()->isVectorTy() &&
+ (!OtherOpT->getType()->isVectorTy() ||
+ !OtherOpF->getType()->isVectorTy()))
+ return nullptr;
+
// If we reach here, they do have operations in common.
Value *NewSI = Builder.CreateSelect(SI.getCondition(), OtherOpT, OtherOpF,
SI.getName() + ".v", &SI);
Modified: llvm/trunk/test/Transforms/InstCombine/select-gep.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/select-gep.ll?rev=341666&r1=341665&r2=341666&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/select-gep.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/select-gep.ll Fri Sep 7 07:40:06 2018
@@ -136,3 +136,17 @@ define i32* @test4(i32* %p, i32* %q, i64
ret i32* %select
}
+; We cannot create a select with a vector condition but scalar operands.
+
+define <2 x i64*> @test5(i64* %p1, i64* %p2, <2 x i64> %idx, <2 x i1> %cc) {
+; CHECK-LABEL: @test5(
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i64, i64* %p1, <2 x i64> %idx
+; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i64, i64* %p2, <2 x i64> %idx
+; CHECK-NEXT: [[SELECT:%.*]] = select <2 x i1> %cc, <2 x i64*> [[GEP1]], <2 x i64*> [[GEP2]]
+; CHECK-NEXT: ret <2 x i64*> [[SELECT]]
+;
+ %gep1 = getelementptr i64, i64* %p1, <2 x i64> %idx
+ %gep2 = getelementptr i64, i64* %p2, <2 x i64> %idx
+ %select = select <2 x i1> %cc, <2 x i64*> %gep1, <2 x i64*> %gep2
+ ret <2 x i64*> %select
+}
More information about the llvm-commits
mailing list