Skip to content

Commit 70a9535

Browse files
[Instrumentation][nsan] Add support for Freeze instruction (#100490)
Add support for Freeze. This fixes #98143 .
1 parent f4be681 commit 70a9535

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1725,6 +1725,9 @@ Value *NumericalStabilitySanitizer::createShadowValueWithOperandsAvailable(
17251725
Map.getShadow(S->getTrueValue()),
17261726
Map.getShadow(S->getFalseValue()));
17271727

1728+
if (auto *Freeze = dyn_cast<FreezeInst>(&Inst))
1729+
return Builder.CreateFreeze(Map.getShadow(Freeze->getOperand(0)));
1730+
17281731
if (auto *Extract = dyn_cast<ExtractElementInst>(&Inst))
17291732
return Builder.CreateExtractElement(
17301733
Map.getShadow(Extract->getVectorOperand()), Extract->getIndexOperand());

llvm/test/Instrumentation/NumericalStabilitySanitizer/basic.ll

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,29 @@ entry:
737737
ret void
738738
}
739739

740+
define void @freeze_vector_insert(<2 x float> %vec, i32 %idx, float %scalar) sanitize_numerical_stability {
741+
; CHECK-LABEL: @freeze_vector_insert(
742+
; CHECK-NEXT: entry:
743+
; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__nsan_shadow_args_tag, align 8
744+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], ptrtoint (ptr @freeze_vector_insert to i64)
745+
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x double>, ptr @__nsan_shadow_args_ptr, align 1
746+
; CHECK-NEXT: [[TMP3:%.*]] = fpext <2 x float> [[VEC:%.*]] to <2 x double>
747+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP1]], <2 x double> [[TMP2]], <2 x double> [[TMP3]]
748+
; CHECK-NEXT: [[TMP5:%.*]] = load double, ptr getelementptr ([16384 x i8], ptr @__nsan_shadow_args_ptr, i64 0, i64 16), align 1
749+
; CHECK-NEXT: [[TMP6:%.*]] = fpext float [[SCALAR:%.*]] to double
750+
; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], double [[TMP5]], double [[TMP6]]
751+
; CHECK-NEXT: store i64 0, ptr @__nsan_shadow_args_tag, align 8
752+
; CHECK-NEXT: [[TMP8:%.*]] = insertelement <2 x float> [[VEC]], float [[SCALAR]], i32 [[IDX:%.*]]
753+
; CHECK-NEXT: [[TMP9:%.*]] = insertelement <2 x double> [[TMP4]], double [[TMP7]], i32 [[IDX]]
754+
; CHECK-NEXT: [[FROZEN:%.*]] = freeze <2 x float> [[TMP8]]
755+
; CHECK-NEXT: [[TMP10:%.*]] = freeze <2 x double> [[TMP9]]
756+
; CHECK-NEXT: ret void
757+
;
758+
entry:
759+
%1 = insertelement <2 x float> %vec, float %scalar, i32 %idx
760+
%frozen = freeze <2 x float> %1
761+
ret void
762+
}
740763

741764
define void @vector_shuffle(<2 x float> %0) sanitize_numerical_stability {
742765
; CHECK-LABEL: @vector_shuffle(

0 commit comments

Comments
 (0)