From 2c8d0048f03d054f13909a26f959ef95b2a0a4de Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 13 Apr 2023 09:35:18 -0400 Subject: [PATCH] ValueTracking: Handle freeze in computeKnownFPClass --- llvm/lib/Analysis/ValueTracking.cpp | 3 ++- llvm/test/Transforms/Attributor/nofpclass.ll | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index cad331b..1c0dbba 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -4625,7 +4625,8 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts, break; } - case Instruction::ExtractValue: { + case Instruction::ExtractValue: + case Instruction::Freeze: { computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedClasses, Known, Depth + 1, Q, TLI); break; diff --git a/llvm/test/Transforms/Attributor/nofpclass.ll b/llvm/test/Transforms/Attributor/nofpclass.ll index 52c9c2e..6ac9baf 100644 --- a/llvm/test/Transforms/Attributor/nofpclass.ll +++ b/llvm/test/Transforms/Attributor/nofpclass.ll @@ -884,3 +884,27 @@ define float @returned_extractvalue([4 x float] nofpclass(nan) %array) { %extract = extractvalue [4 x float] %array, 0 ret float %extract } + +define float @return_nofpclass_freeze_nan_arg(float nofpclass(nan) %arg) { +; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK-LABEL: define noundef nofpclass(nan) float @return_nofpclass_freeze_nan_arg +; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR2]] { +; CHECK-NEXT: [[FREEZE:%.*]] = freeze float [[ARG]] +; CHECK-NEXT: ret float [[FREEZE]] +; + %freeze = freeze float %arg + ret float %freeze +} + +define float @return_nofpclass_extractelement_freeze_pinf_arg(<2 x float> nofpclass(pinf) %arg) { +; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK-LABEL: define noundef nofpclass(pinf) float @return_nofpclass_extractelement_freeze_pinf_arg +; CHECK-SAME: (<2 x float> nofpclass(pinf) [[ARG:%.*]]) #[[ATTR2]] { +; CHECK-NEXT: [[FREEZE:%.*]] = freeze <2 x float> [[ARG]] +; CHECK-NEXT: [[ELT:%.*]] = extractelement <2 x float> [[FREEZE]], i32 0 +; CHECK-NEXT: ret float [[ELT]] +; + %freeze = freeze <2 x float> %arg + %elt = extractelement <2 x float> %freeze, i32 0 + ret float %elt +} -- 2.7.4