From: Matt Arsenault Date: Sun, 4 Dec 2022 00:32:41 +0000 (-0500) Subject: ValueTracking: Teach CannotBeOrderedLessThanZero about copysign X-Git-Tag: upstream/17.0.6~25116 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7f4429c0e48b9c7d31ff587604707cf10d3acdf0;p=platform%2Fupstream%2Fllvm.git ValueTracking: Teach CannotBeOrderedLessThanZero about copysign --- diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index bc63368..8e97637 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -3694,7 +3694,10 @@ static bool cannotBeOrderedLessThanZeroImpl(const Value *V, case Intrinsic::exp2: case Intrinsic::fabs: return true; - + case Intrinsic::copysign: + // Only the sign operand matters. + return cannotBeOrderedLessThanZeroImpl(I->getOperand(1), TLI, true, + Depth + 1); case Intrinsic::sqrt: // sqrt(x) is always >= -0 or NaN. Moreover, sqrt(x) == -0 iff x == -0. if (!SignBitOnly) diff --git a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll index 0c0f7b6..a2aac2d 100644 --- a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll +++ b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll @@ -279,6 +279,7 @@ define float @PR22688(float %x) { declare float @llvm.fabs.f32(float) declare float @llvm.canonicalize.f32(float) declare float @llvm.arithmetic.fence.f32(float) +declare float @llvm.copysign.f32(float, float) declare <2 x float> @llvm.fabs.v2f32(<2 x float>) declare float @llvm.sqrt.f32(float) declare float @llvm.maxnum.f32(float, float) @@ -955,3 +956,37 @@ define i1 @arithmetic_fence_unknown_positive(float %unknown) { %cmp = fcmp nnan oge float %known.positive, 0.0 ret i1 %cmp } + +define i1 @copysign_known_positive_maybe_neg0(float %unknown, float %sign) { +; CHECK-LABEL: @copysign_known_positive_maybe_neg0( +; CHECK-NEXT: [[SQRT:%.*]] = call nnan ninf float @llvm.sqrt.f32(float [[SIGN:%.*]]) +; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.copysign.f32(float [[UNKNOWN:%.*]], float [[SQRT]]) +; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge float [[COPYSIGN]], 0.000000e+00 +; CHECK-NEXT: ret i1 [[CMP]] +; + %sqrt = call ninf nnan float @llvm.sqrt.f32(float %sign) + %copysign = call float @llvm.copysign.f32(float %unknown, float %sqrt) + %cmp = fcmp nnan oge float %copysign, 0.0 + ret i1 %cmp +} + +define i1 @copysign_known_positive(float %unknown, float %sign) { +; CHECK-LABEL: @copysign_known_positive( +; CHECK-NEXT: ret i1 true +; + %sqrt = call ninf nnan nsz float @llvm.sqrt.f32(float %sign) + %copysign = call float @llvm.copysign.f32(float %unknown, float %sqrt) + %cmp = fcmp nnan oge float %copysign, 0.0 + ret i1 %cmp +} + +define i1 @copysign_unknown_positive(float %unknown, float %unknown.sign) { +; CHECK-LABEL: @copysign_unknown_positive( +; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.copysign.f32(float [[UNKNOWN:%.*]], float [[UNKNOWN_SIGN:%.*]]) +; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge float [[COPYSIGN]], 0.000000e+00 +; CHECK-NEXT: ret i1 [[CMP]] +; + %copysign = call float @llvm.copysign.f32(float %unknown, float %unknown.sign) + %cmp = fcmp nnan oge float %copysign, 0.0 + ret i1 %cmp +}