diff options
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 12 | ||||
-rw-r--r-- | test/Transforms/InstCombine/2008-05-22-IDivVector.ll | 6 |
2 files changed, 16 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 13dbc11526..a398884e59 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -3276,8 +3276,16 @@ Instruction *InstCombiner::commonIDivTransforms(BinaryOperator &I) { Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); // (sdiv X, X) --> 1 (udiv X, X) --> 1 - if (Op0 == Op1) - return ReplaceInstUsesWith(I, ConstantInt::get(I.getType(), 1)); + if (Op0 == Op1) { + if (const VectorType *Ty = dyn_cast<VectorType>(I.getType())) { + ConstantInt *CI = ConstantInt::get(Ty->getElementType(), 1); + std::vector<Constant*> Elts(Ty->getNumElements(), CI); + return ReplaceInstUsesWith(I, ConstantVector::get(Elts)); + } + + ConstantInt *CI = ConstantInt::get(I.getType(), 1); + return ReplaceInstUsesWith(I, CI); + } if (Instruction *Common = commonDivTransforms(I)) return Common; diff --git a/test/Transforms/InstCombine/2008-05-22-IDivVector.ll b/test/Transforms/InstCombine/2008-05-22-IDivVector.ll new file mode 100644 index 0000000000..ad70b658d3 --- /dev/null +++ b/test/Transforms/InstCombine/2008-05-22-IDivVector.ll @@ -0,0 +1,6 @@ +; RUN: llvm-as < %s | opt -instcombine -disable-output + +define <3 x i8> @f(<3 x i8> %i) { + %A = sdiv <3 x i8> %i, %i + ret <3 x i8> %A +} |