@@ -18703,13 +18703,13 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
1870318703
1870418704 // if cond is a bool emit a select instruction
1870518705 if (TCond->isIntegerTy(1))
18706- return Builder.CreateSelect(OpCond, OpTrue, OpFalse);
18706+ return Builder.CreateSelect(OpCond, OpTrue, OpFalse, "hlsl.select" );
1870718707
1870818708 // if cond is a vector of bools lower to a shufflevector
1870918709 // todo check if that true and false are vectors
1871018710 // todo check that the size of true and false and cond are the same
1871118711 if (TCond->isVectorTy() &&
18712- E->getArg(0)->getType()->getAs<VectorType>()->isBooleanType()) {
18712+ E->getArg(0)->getType()->getAs<VectorType>()->getElementType()-> isBooleanType()) {
1871318713 assert(OpTrue->getType()->isVectorTy() && OpFalse->getType()->isVectorTy() &&
1871418714 "Select's second and third operands must be vectors if first operand is a vector.");
1871518715
@@ -18723,15 +18723,18 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
1872318723 assert(N == VecTyFalse->getNumElements() &&
1872418724 N == E->getArg(0)->getType()->getAs<VectorType>()->getNumElements() &&
1872518725 "Select requires vectors to be of the same size.");
18726-
18727- llvm::SmallVector< Value *> Mask ;
18726+
18727+ llvm::Value *Result = llvm::PoisonValue::get(llvm::FixedVectorType::get(IntTy, N)) ;
1872818728 for (unsigned I = 0; I < N; I++) {
1872918729 Value *Index = ConstantInt::get(IntTy, I);
1873018730 Value *IndexBool = Builder.CreateExtractElement(OpCond, Index);
18731- Mask.push_back(Builder.CreateSelect(IndexBool, Index, ConstantInt::get(IntTy, I + N)));
18731+ Value *TVal = Builder.CreateExtractElement(OpTrue, Index);
18732+ Value *FVal = Builder.CreateExtractElement(OpFalse, Index);
18733+ Value *IndexSelect = Builder.CreateSelect(IndexBool, TVal, FVal);
18734+ Result = Builder.CreateInsertElement(Result, IndexSelect, Index);
1873218735 }
18733-
18734- return Builder.CreateShuffleVector(OpTrue, OpFalse, BuildVector(Mask)) ;
18736+
18737+ return Result ;
1873518738 }
1873618739
1873718740 llvm_unreachable("Select requires a bool or vector of bools as its first operand.");
0 commit comments