diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp index 76c63dd2385090..ed7415d45c3176 100644 --- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp +++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp @@ -46,8 +46,9 @@ static cl::opt DisableVectorCombine( static bool isExtractExtractCheap(Instruction *Ext0, Instruction *Ext1, unsigned Opcode, const TargetTransformInfo &TTI) { - assert(Ext0->getOperand(1) == Ext1->getOperand(1) && - isa(Ext0->getOperand(1)) && + assert(isa(Ext0->getOperand(1)) && + (cast(Ext0->getOperand(1))->getZExtValue() == + cast(Ext1->getOperand(1))->getZExtValue()) && "Expected same constant extract index"); Type *ScalarTy = Ext0->getType(); diff --git a/llvm/test/Transforms/VectorCombine/X86/extract-binop.ll b/llvm/test/Transforms/VectorCombine/X86/extract-binop.ll index 30d0475437bdd4..078cf7b02cf4dd 100644 --- a/llvm/test/Transforms/VectorCombine/X86/extract-binop.ll +++ b/llvm/test/Transforms/VectorCombine/X86/extract-binop.ll @@ -147,6 +147,20 @@ define i32 @ext1_ext1_add_same_vec_cse(<4 x i32> %x) { ret i32 %r } +; Don't assert if extract indices have different types. + +define i32 @ext1_ext1_add_same_vec_diff_idx_ty(<4 x i32> %x) { +; CHECK-LABEL: @ext1_ext1_add_same_vec_diff_idx_ty( +; CHECK-NEXT: [[TMP1:%.*]] = add <4 x i32> [[X:%.*]], [[X]] +; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i32> [[TMP1]], i32 1 +; CHECK-NEXT: ret i32 [[TMP2]] +; + %e0 = extractelement <4 x i32> %x, i32 1 + %e1 = extractelement <4 x i32> %x, i64 1 + %r = add i32 %e0, %e1 + ret i32 %r +} + declare void @use_i8(i8) ; Negative test - same vector operand; scalar code is cheaper than general case