diff --git a/llvm/lib/CodeGen/ExpandReductions.cpp b/llvm/lib/CodeGen/ExpandReductions.cpp --- a/llvm/lib/CodeGen/ExpandReductions.cpp +++ b/llvm/lib/CodeGen/ExpandReductions.cpp @@ -78,9 +78,28 @@ bool expandReductions(Function &F, const TargetTransformInfo *TTI) { bool Changed = false; SmallVector Worklist; - for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) - if (auto II = dyn_cast(&*I)) - Worklist.push_back(II); + for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) { + if (auto II = dyn_cast(&*I)) { + switch (II->getIntrinsicID()) { + default: break; + case Intrinsic::experimental_vector_reduce_v2_fadd: + case Intrinsic::experimental_vector_reduce_v2_fmul: + case Intrinsic::experimental_vector_reduce_add: + case Intrinsic::experimental_vector_reduce_mul: + case Intrinsic::experimental_vector_reduce_and: + case Intrinsic::experimental_vector_reduce_or: + case Intrinsic::experimental_vector_reduce_xor: + case Intrinsic::experimental_vector_reduce_smax: + case Intrinsic::experimental_vector_reduce_smin: + case Intrinsic::experimental_vector_reduce_umax: + case Intrinsic::experimental_vector_reduce_umin: + case Intrinsic::experimental_vector_reduce_fmax: + case Intrinsic::experimental_vector_reduce_fmin: + Worklist.push_back(II); + break; + } + } + } for (auto *II : Worklist) { if (!TTI->shouldExpandReduction(II)) @@ -96,6 +115,7 @@ IRBuilder<>::FastMathFlagGuard FMFGuard(Builder); Builder.setFastMathFlags(FMF); switch (ID) { + default: llvm_unreachable("Unexpected intrinsic!"); case Intrinsic::experimental_vector_reduce_v2_fadd: case Intrinsic::experimental_vector_reduce_v2_fmul: { // FMFs must be attached to the call, otherwise it's an ordered reduction @@ -109,7 +129,8 @@ Rdx = Builder.CreateBinOp((Instruction::BinaryOps)getOpcode(ID), Acc, Rdx, "bin.rdx"); } - } break; + break; + } case Intrinsic::experimental_vector_reduce_add: case Intrinsic::experimental_vector_reduce_mul: case Intrinsic::experimental_vector_reduce_and: @@ -123,9 +144,8 @@ case Intrinsic::experimental_vector_reduce_fmin: { Value *Vec = II->getArgOperand(0); Rdx = getShuffleReduction(Builder, Vec, getOpcode(ID), MRK); - } break; - default: - continue; + break; + } } II->replaceAllUsesWith(Rdx); II->eraseFromParent();