diff --git a/llvm/lib/Transforms/Scalar/Scalarizer.cpp b/llvm/lib/Transforms/Scalar/Scalarizer.cpp --- a/llvm/lib/Transforms/Scalar/Scalarizer.cpp +++ b/llvm/lib/Transforms/Scalar/Scalarizer.cpp @@ -228,6 +228,7 @@ bool visitLoadInst(LoadInst &LI); bool visitStoreInst(StoreInst &SI); bool visitCallInst(CallInst &ICI); + bool visitFreezeInst(FreezeInst &FI); private: Scatterer scatter(Instruction *Point, Value *V, Type *PtrElemTy = nullptr); @@ -972,6 +973,12 @@ return splitCall(CI); } +bool ScalarizerVisitor::visitFreezeInst(FreezeInst &FI) { + return splitUnary(FI, [](IRBuilder<> &Builder, Value *Op, const Twine &Name) { + return Builder.CreateFreeze(Op, Name); + }); +} + // Delete the instructions that we scalarized. If a full vector result // is still needed, recreate it using InsertElements. bool ScalarizerVisitor::finish() { diff --git a/llvm/test/Transforms/Scalarizer/basic.ll b/llvm/test/Transforms/Scalarizer/basic.ll --- a/llvm/test/Transforms/Scalarizer/basic.ll +++ b/llvm/test/Transforms/Scalarizer/basic.ll @@ -833,7 +833,12 @@ define <2 x i32> @f24(<2 x i32> %src) { ; CHECK-LABEL: @f24( -; CHECK-NEXT: [[FRZ:%.*]] = freeze <2 x i32> [[SRC:%.*]] +; CHECK-NEXT: [[SRC_I0:%.*]] = extractelement <2 x i32> [[SRC:%.*]], i64 0 +; CHECK-NEXT: [[FRZ_I0:%.*]] = freeze i32 [[SRC_I0]] +; CHECK-NEXT: [[SRC_I1:%.*]] = extractelement <2 x i32> [[SRC]], i64 1 +; CHECK-NEXT: [[FRZ_I1:%.*]] = freeze i32 [[SRC_I1]] +; CHECK-NEXT: [[FRZ_UPTO0:%.*]] = insertelement <2 x i32> poison, i32 [[FRZ_I0]], i64 0 +; CHECK-NEXT: [[FRZ:%.*]] = insertelement <2 x i32> [[FRZ_UPTO0]], i32 [[FRZ_I1]], i64 1 ; CHECK-NEXT: ret <2 x i32> [[FRZ]] ; %frz = freeze <2 x i32> %src @@ -846,12 +851,9 @@ ; CHECK-NEXT: [[ADD_I0:%.*]] = fadd float [[SRC_I0]], [[SRC_I0]] ; CHECK-NEXT: [[SRC_I1:%.*]] = extractelement <2 x float> [[SRC]], i64 1 ; CHECK-NEXT: [[ADD_I1:%.*]] = fadd float [[SRC_I1]], [[SRC_I1]] -; CHECK-NEXT: [[ADD_UPTO0:%.*]] = insertelement <2 x float> poison, float [[ADD_I0]], i64 0 -; CHECK-NEXT: [[ADD:%.*]] = insertelement <2 x float> [[ADD_UPTO0]], float [[ADD_I1]], i64 1 -; CHECK-NEXT: [[FRZ:%.*]] = freeze <2 x float> [[ADD]] -; CHECK-NEXT: [[FRZ_I0:%.*]] = extractelement <2 x float> [[FRZ]], i64 0 +; CHECK-NEXT: [[FRZ_I0:%.*]] = freeze float [[ADD_I0]] +; CHECK-NEXT: [[FRZ_I1:%.*]] = freeze float [[ADD_I1]] ; CHECK-NEXT: [[MUL_I0:%.*]] = fmul float [[FRZ_I0]], [[FRZ_I0]] -; CHECK-NEXT: [[FRZ_I1:%.*]] = extractelement <2 x float> [[FRZ]], i64 1 ; CHECK-NEXT: [[MUL_I1:%.*]] = fmul float [[FRZ_I1]], [[FRZ_I1]] ; CHECK-NEXT: [[MUL_UPTO0:%.*]] = insertelement <2 x float> poison, float [[MUL_I0]], i64 0 ; CHECK-NEXT: [[MUL:%.*]] = insertelement <2 x float> [[MUL_UPTO0]], float [[MUL_I1]], i64 1