Index: lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -1260,8 +1260,19 @@ break; } case Instruction::Select: { + // If this is a vector select, try to transform the select condition based + // on the current demanded elements. + if (I->getOperand(0)->getType()->isVectorTy()) { + if (Value *V = SimplifyDemandedVectorElts(I->getOperand(0), DemandedElts, + UndefElts, Depth + 1)) { + I->setOperand(0, V); + MadeChange = true; + } + } + + // Next, see if we can transform the arms of the select. APInt LeftDemanded(DemandedElts), RightDemanded(DemandedElts); - if (ConstantVector* CV = dyn_cast(I->getOperand(0))) { + if (auto *CV = dyn_cast(I->getOperand(0))) { for (unsigned i = 0; i < VWidth; i++) { Constant *CElt = CV->getAggregateElement(i); // Method isNullValue always returns false when called on a Index: test/Transforms/InstCombine/shuffle-select-narrow.ll =================================================================== --- test/Transforms/InstCombine/shuffle-select-narrow.ll +++ test/Transforms/InstCombine/shuffle-select-narrow.ll @@ -16,11 +16,11 @@ ret <2 x i8> %r } -; TODO: The 1st shuffle is not extending with undefs, but demanded elements should correct that. +; TODO: The 1st shuffle is not extending with undefs, but demanded elements corrects that. define <2 x i8> @narrow_shuffle_of_select_overspecified_extend(<2 x i1> %cmp, <4 x i8> %x, <4 x i8> %y) { ; CHECK-LABEL: @narrow_shuffle_of_select_overspecified_extend( -; CHECK-NEXT: [[WIDECMP:%.*]] = shufflevector <2 x i1> [[CMP:%.*]], <2 x i1> undef, <4 x i32> +; CHECK-NEXT: [[WIDECMP:%.*]] = shufflevector <2 x i1> [[CMP:%.*]], <2 x i1> undef, <4 x i32> ; CHECK-NEXT: [[WIDESEL:%.*]] = select <4 x i1> [[WIDECMP]], <4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]] ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i8> [[WIDESEL]], <4 x i8> undef, <2 x i32> ; CHECK-NEXT: ret <2 x i8> [[R]] @@ -35,7 +35,7 @@ define <3 x float> @narrow_shuffle_of_select_undefs(<3 x i1> %cmp, <4 x float> %x, <4 x float> %y) { ; CHECK-LABEL: @narrow_shuffle_of_select_undefs( -; CHECK-NEXT: [[WIDECMP:%.*]] = shufflevector <3 x i1> [[CMP:%.*]], <3 x i1> undef, <4 x i32> +; CHECK-NEXT: [[WIDECMP:%.*]] = shufflevector <3 x i1> [[CMP:%.*]], <3 x i1> undef, <4 x i32> ; CHECK-NEXT: [[WIDESEL:%.*]] = select <4 x i1> [[WIDECMP]], <4 x float> [[X:%.*]], <4 x float> [[Y:%.*]] ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x float> [[WIDESEL]], <4 x float> undef, <3 x i32> ; CHECK-NEXT: ret <3 x float> [[R]] @@ -94,7 +94,7 @@ define <3 x i8> @narrow_shuffle_of_select_mismatch_types2(<4 x i1> %cmp, <6 x i8> %x, <6 x i8> %y) { ; CHECK-LABEL: @narrow_shuffle_of_select_mismatch_types2( -; CHECK-NEXT: [[WIDECMP:%.*]] = shufflevector <4 x i1> [[CMP:%.*]], <4 x i1> undef, <6 x i32> +; CHECK-NEXT: [[WIDECMP:%.*]] = shufflevector <4 x i1> [[CMP:%.*]], <4 x i1> undef, <6 x i32> ; CHECK-NEXT: [[WIDESEL:%.*]] = select <6 x i1> [[WIDECMP]], <6 x i8> [[X:%.*]], <6 x i8> [[Y:%.*]] ; CHECK-NEXT: [[R:%.*]] = shufflevector <6 x i8> [[WIDESEL]], <6 x i8> undef, <3 x i32> ; CHECK-NEXT: ret <3 x i8> [[R]]