diff --git a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp index b382fedde027bc..832506f639a748 100644 --- a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp @@ -1725,6 +1725,9 @@ Value *NumericalStabilitySanitizer::createShadowValueWithOperandsAvailable( Map.getShadow(S->getTrueValue()), Map.getShadow(S->getFalseValue())); + if (auto *Freeze = dyn_cast(&Inst)) + return Builder.CreateFreeze(Map.getShadow(Freeze->getOperand(0))); + if (auto *Extract = dyn_cast(&Inst)) return Builder.CreateExtractElement( Map.getShadow(Extract->getVectorOperand()), Extract->getIndexOperand()); diff --git a/llvm/test/Instrumentation/NumericalStabilitySanitizer/basic.ll b/llvm/test/Instrumentation/NumericalStabilitySanitizer/basic.ll index 8110dd485d369b..5da68320d91f90 100644 --- a/llvm/test/Instrumentation/NumericalStabilitySanitizer/basic.ll +++ b/llvm/test/Instrumentation/NumericalStabilitySanitizer/basic.ll @@ -737,6 +737,29 @@ entry: ret void } +define void @freeze_vector_insert(<2 x float> %vec, i32 %idx, float %scalar) sanitize_numerical_stability { +; CHECK-LABEL: @freeze_vector_insert( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__nsan_shadow_args_tag, align 8 +; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], ptrtoint (ptr @freeze_vector_insert to i64) +; CHECK-NEXT: [[TMP2:%.*]] = load <2 x double>, ptr @__nsan_shadow_args_ptr, align 1 +; CHECK-NEXT: [[TMP3:%.*]] = fpext <2 x float> [[VEC:%.*]] to <2 x double> +; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP1]], <2 x double> [[TMP2]], <2 x double> [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = load double, ptr getelementptr ([16384 x i8], ptr @__nsan_shadow_args_ptr, i64 0, i64 16), align 1 +; CHECK-NEXT: [[TMP6:%.*]] = fpext float [[SCALAR:%.*]] to double +; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], double [[TMP5]], double [[TMP6]] +; CHECK-NEXT: store i64 0, ptr @__nsan_shadow_args_tag, align 8 +; CHECK-NEXT: [[TMP8:%.*]] = insertelement <2 x float> [[VEC]], float [[SCALAR]], i32 [[IDX:%.*]] +; CHECK-NEXT: [[TMP9:%.*]] = insertelement <2 x double> [[TMP4]], double [[TMP7]], i32 [[IDX]] +; CHECK-NEXT: [[FROZEN:%.*]] = freeze <2 x float> [[TMP8]] +; CHECK-NEXT: [[TMP10:%.*]] = freeze <2 x double> [[TMP9]] +; CHECK-NEXT: ret void +; +entry: + %1 = insertelement <2 x float> %vec, float %scalar, i32 %idx + %frozen = freeze <2 x float> %1 + ret void +} define void @vector_shuffle(<2 x float> %0) sanitize_numerical_stability { ; CHECK-LABEL: @vector_shuffle(