Author: Nikita Popov Date: 2021-01-03T22:05:40+01:00 New Revision: 3715c99be9dcde1421f2365a59ab2bc433993d7c
URL: https://github.com/llvm/llvm-project/commit/3715c99be9dcde1421f2365a59ab2bc433993d7c DIFF: https://github.com/llvm/llvm-project/commit/3715c99be9dcde1421f2365a59ab2bc433993d7c.diff LOG: [InstSimplify] Fold nnan/ninf violation to poison As the comment already indicates, performing an operation with nnan/ninf flags on a nan/inf or undef results in poison. Now that we have a proper poison value, we no longer need to relax it to undef. Added: Modified: llvm/lib/Analysis/InstructionSimplify.cpp llvm/test/Transforms/InstSimplify/fp-nan.ll llvm/test/Transforms/InstSimplify/fp-undef-poison.ll Removed: ################################################################################ diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 0655374cbc1dd..d89a776b7908b 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4781,11 +4781,11 @@ static Constant *simplifyFPOp(ArrayRef<Value *> Ops, // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand // (an undef operand can be chosen to be Nan/Inf), then the result of - // this operation is poison. That result can be relaxed to undef. + // this operation is poison. if (FMF.noNaNs() && (IsNan || IsUndef)) - return UndefValue::get(V->getType()); + return PoisonValue::get(V->getType()); if (FMF.noInfs() && (IsInf || IsUndef)) - return UndefValue::get(V->getType()); + return PoisonValue::get(V->getType()); if (IsUndef || IsNan) return propagateNaN(cast<Constant>(V)); diff --git a/llvm/test/Transforms/InstSimplify/fp-nan.ll b/llvm/test/Transforms/InstSimplify/fp-nan.ll index 7382fdfbe1a25..4cce3be002e9e 100644 --- a/llvm/test/Transforms/InstSimplify/fp-nan.ll +++ b/llvm/test/Transforms/InstSimplify/fp-nan.ll @@ -137,7 +137,7 @@ define <2 x double> @unary_fneg_nan_2(<2 x double> %x) { define float @fadd_nan_op0_nnan(float %x) { ; CHECK-LABEL: @fadd_nan_op0_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fadd nnan float 0x7FF8000000000000, %x ret float %r @@ -145,7 +145,7 @@ define float @fadd_nan_op0_nnan(float %x) { define float @fadd_nan_op1_fast(float %x) { ; CHECK-LABEL: @fadd_nan_op1_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fadd fast float %x, 0x7FF8000000000000 ret float %r @@ -153,7 +153,7 @@ define float @fadd_nan_op1_fast(float %x) { define float @fsub_nan_op0_fast(float %x) { ; CHECK-LABEL: @fsub_nan_op0_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fsub fast float 0x7FF8000000000000, %x ret float %r @@ -161,7 +161,7 @@ define float @fsub_nan_op0_fast(float %x) { define float @fsub_nan_op1_nnan(float %x) { ; CHECK-LABEL: @fsub_nan_op1_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fsub nnan float %x, 0x7FF8000000000000 ret float %r @@ -169,7 +169,7 @@ define float @fsub_nan_op1_nnan(float %x) { define float @fmul_nan_op0_nnan(float %x) { ; CHECK-LABEL: @fmul_nan_op0_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fmul nnan float 0x7FF8000000000000, %x ret float %r @@ -177,7 +177,7 @@ define float @fmul_nan_op0_nnan(float %x) { define float @fmul_nan_op1_fast(float %x) { ; CHECK-LABEL: @fmul_nan_op1_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fmul fast float %x, 0x7FF8000000000000 ret float %r @@ -185,7 +185,7 @@ define float @fmul_nan_op1_fast(float %x) { define float @fdiv_nan_op0_fast(float %x) { ; CHECK-LABEL: @fdiv_nan_op0_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fdiv fast float 0x7FF8000000000000, %x ret float %r @@ -193,7 +193,7 @@ define float @fdiv_nan_op0_fast(float %x) { define float @fdiv_nan_op1_nnan(float %x) { ; CHECK-LABEL: @fdiv_nan_op1_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fdiv nnan float %x, 0x7FF8000000000000 ret float %r @@ -201,7 +201,7 @@ define float @fdiv_nan_op1_nnan(float %x) { define float @frem_nan_op0_nnan(float %x) { ; CHECK-LABEL: @frem_nan_op0_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = frem nnan float 0x7FF8000000000000, %x ret float %r @@ -209,7 +209,7 @@ define float @frem_nan_op0_nnan(float %x) { define float @frem_nan_op1_fast(float %x) { ; CHECK-LABEL: @frem_nan_op1_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = frem fast float %x, 0x7FF8000000000000 ret float %r diff --git a/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll b/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll index 696dc84bd4ce2..129d868704c46 100644 --- a/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll +++ b/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll @@ -167,7 +167,7 @@ define float @frem_poison_op1(float %x) { define float @fadd_undef_op0_nnan(float %x) { ; CHECK-LABEL: @fadd_undef_op0_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fadd nnan float undef, %x ret float %r @@ -175,7 +175,7 @@ define float @fadd_undef_op0_nnan(float %x) { define float @fadd_undef_op1_fast(float %x) { ; CHECK-LABEL: @fadd_undef_op1_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fadd fast float %x, undef ret float %r @@ -183,7 +183,7 @@ define float @fadd_undef_op1_fast(float %x) { define float @fsub_undef_op0_fast(float %x) { ; CHECK-LABEL: @fsub_undef_op0_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fsub fast float undef, %x ret float %r @@ -191,7 +191,7 @@ define float @fsub_undef_op0_fast(float %x) { define float @fsub_undef_op1_nnan(float %x) { ; CHECK-LABEL: @fsub_undef_op1_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fsub nnan float %x, undef ret float %r @@ -199,7 +199,7 @@ define float @fsub_undef_op1_nnan(float %x) { define float @fmul_undef_op0_nnan(float %x) { ; CHECK-LABEL: @fmul_undef_op0_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fmul nnan float undef, %x ret float %r @@ -207,7 +207,7 @@ define float @fmul_undef_op0_nnan(float %x) { define float @fmul_undef_op1_fast(float %x) { ; CHECK-LABEL: @fmul_undef_op1_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fmul fast float %x, undef ret float %r @@ -215,7 +215,7 @@ define float @fmul_undef_op1_fast(float %x) { define float @fdiv_undef_op0_fast(float %x) { ; CHECK-LABEL: @fdiv_undef_op0_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fdiv fast float undef, %x ret float %r @@ -223,7 +223,7 @@ define float @fdiv_undef_op0_fast(float %x) { define float @fdiv_undef_op1_nnan(float %x) { ; CHECK-LABEL: @fdiv_undef_op1_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = fdiv nnan float %x, undef ret float %r @@ -231,7 +231,7 @@ define float @fdiv_undef_op1_nnan(float %x) { define float @frem_undef_op0_nnan(float %x) { ; CHECK-LABEL: @frem_undef_op0_nnan( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = frem nnan float undef, %x ret float %r @@ -239,7 +239,7 @@ define float @frem_undef_op0_nnan(float %x) { define float @frem_undef_op1_fast(float %x) { ; CHECK-LABEL: @frem_undef_op1_fast( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float poison ; %r = frem fast float %x, undef ret float %r @@ -263,7 +263,7 @@ define double @fadd_ninf_nan_op1(double %x) { define double @fdiv_ninf_inf_op0(double %x) { ; CHECK-LABEL: @fdiv_ninf_inf_op0( -; CHECK-NEXT: ret double undef +; CHECK-NEXT: ret double poison ; %r = fdiv ninf double 0x7ff0000000000000, %x ret double %r @@ -271,7 +271,7 @@ define double @fdiv_ninf_inf_op0(double %x) { define double @fadd_ninf_inf_op1(double %x) { ; CHECK-LABEL: @fadd_ninf_inf_op1( -; CHECK-NEXT: ret double undef +; CHECK-NEXT: ret double poison ; %r = fadd ninf double %x, 0xfff0000000000000 ret double %r _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits