From 5a5c33d8b5e6a7d95507c3832768820e508e060c Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Fri, 16 Mar 2018 20:55:55 +0000 Subject: [PATCH] [InstSimplify] add NaN constant diversity; NFC llvm-svn: 327743 --- llvm/test/Transforms/InstSimplify/fp-nan.ll | 114 +++++++++++++------- 1 file changed, 75 insertions(+), 39 deletions(-) diff --git a/llvm/test/Transforms/InstSimplify/fp-nan.ll b/llvm/test/Transforms/InstSimplify/fp-nan.ll index 9c2034041a11..7e75ae1f630f 100644 --- a/llvm/test/Transforms/InstSimplify/fp-nan.ll +++ b/llvm/test/Transforms/InstSimplify/fp-nan.ll @@ -1,85 +1,103 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -instsimplify -S | FileCheck %s -define float @fadd_nan_op0(float %x) { +; Default NaN constant + +define double @fadd_nan_op0(double %x) { ; CHECK-LABEL: @fadd_nan_op0( -; CHECK-NEXT: [[R:%.*]] = fadd float 0x7FF8000000000000, [[X:%.*]] -; CHECK-NEXT: ret float [[R]] +; CHECK-NEXT: [[R:%.*]] = fadd double 0x7FF8000000000000, [[X:%.*]] +; CHECK-NEXT: ret double [[R]] ; - %r = fadd float 0x7FF8000000000000, %x - ret float %r + %r = fadd double 0x7FF8000000000000, %x + ret double %r } -define float @fadd_nan_op1(float %x) { +; Sign bit is set + +define double @fadd_nan_op1(double %x) { ; CHECK-LABEL: @fadd_nan_op1( -; CHECK-NEXT: [[R:%.*]] = fadd float [[X:%.*]], 0x7FF8000000000000 -; CHECK-NEXT: ret float [[R]] +; CHECK-NEXT: [[R:%.*]] = fadd double [[X:%.*]], 0xFFF8000000000000 +; CHECK-NEXT: ret double [[R]] ; - %r = fadd float %x, 0x7FF8000000000000 - ret float %r + %r = fadd double %x, 0xFFF8000000000000 + ret double %r } +; Non-zero payload + define float @fsub_nan_op0(float %x) { ; CHECK-LABEL: @fsub_nan_op0( -; CHECK-NEXT: [[R:%.*]] = fsub float 0x7FF8000000000000, [[X:%.*]] +; CHECK-NEXT: [[R:%.*]] = fsub float 0x7FFFFF0000000000, [[X:%.*]] ; CHECK-NEXT: ret float [[R]] ; - %r = fsub float 0x7FF8000000000000, %x + %r = fsub float 0x7FFFFF0000000000, %x ret float %r } +; Signaling + define float @fsub_nan_op1(float %x) { ; CHECK-LABEL: @fsub_nan_op1( -; CHECK-NEXT: [[R:%.*]] = fsub float [[X:%.*]], 0x7FF8000000000000 +; CHECK-NEXT: [[R:%.*]] = fsub float [[X:%.*]], 0x7FF1000000000000 ; CHECK-NEXT: ret float [[R]] ; - %r = fsub float %x, 0x7FF8000000000000 + %r = fsub float %x, 0x7FF1000000000000 ret float %r } -define float @fmul_nan_op0(float %x) { +; Signaling and signed + +define double @fmul_nan_op0(double %x) { ; CHECK-LABEL: @fmul_nan_op0( -; CHECK-NEXT: [[R:%.*]] = fmul float 0x7FF8000000000000, [[X:%.*]] -; CHECK-NEXT: ret float [[R]] +; CHECK-NEXT: [[R:%.*]] = fmul double 0xFFF0000000000001, [[X:%.*]] +; CHECK-NEXT: ret double [[R]] ; - %r = fmul float 0x7FF8000000000000, %x - ret float %r + %r = fmul double 0xFFF0000000000001, %x + ret double %r } -define float @fmul_nan_op1(float %x) { +; Vector type + +define <2 x float> @fmul_nan_op1(<2 x float> %x) { ; CHECK-LABEL: @fmul_nan_op1( -; CHECK-NEXT: [[R:%.*]] = fmul float [[X:%.*]], 0x7FF8000000000000 -; CHECK-NEXT: ret float [[R]] +; CHECK-NEXT: [[R:%.*]] = fmul <2 x float> [[X:%.*]], +; CHECK-NEXT: ret <2 x float> [[R]] ; - %r = fmul float %x, 0x7FF8000000000000 - ret float %r + %r = fmul <2 x float> %x, + ret <2 x float> %r } -define float @fdiv_nan_op0(float %x) { +; Vector signed and non-zero payload + +define <2 x double> @fdiv_nan_op0(<2 x double> %x) { ; CHECK-LABEL: @fdiv_nan_op0( -; CHECK-NEXT: [[R:%.*]] = fdiv float 0x7FF8000000000000, [[X:%.*]] -; CHECK-NEXT: ret float [[R]] +; CHECK-NEXT: [[R:%.*]] = fdiv <2 x double> , [[X:%.*]] +; CHECK-NEXT: ret <2 x double> [[R]] ; - %r = fdiv float 0x7FF8000000000000, %x - ret float %r + %r = fdiv <2 x double> , %x + ret <2 x double> %r } -define float @fdiv_nan_op1(float %x) { +; Vector with different NaN constant elements + +define <2 x half> @fdiv_nan_op1(<2 x half> %x) { ; CHECK-LABEL: @fdiv_nan_op1( -; CHECK-NEXT: [[R:%.*]] = fdiv float [[X:%.*]], 0x7FF8000000000000 -; CHECK-NEXT: ret float [[R]] +; CHECK-NEXT: [[R:%.*]] = fdiv <2 x half> [[X:%.*]], +; CHECK-NEXT: ret <2 x half> [[R]] ; - %r = fdiv float %x, 0x7FF8000000000000 - ret float %r + %r = fdiv <2 x half> %x, + ret <2 x half> %r } -define float @frem_nan_op0(float %x) { +; Vector with undef element + +define <2 x double> @frem_nan_op0(<2 x double> %x) { ; CHECK-LABEL: @frem_nan_op0( -; CHECK-NEXT: [[R:%.*]] = frem float 0x7FF8000000000000, [[X:%.*]] -; CHECK-NEXT: ret float [[R]] +; CHECK-NEXT: [[R:%.*]] = frem <2 x double> , [[X:%.*]] +; CHECK-NEXT: ret <2 x double> [[R]] ; - %r = frem float 0x7FF8000000000000, %x - ret float %r + %r = frem <2 x double> , %x + ret <2 x double> %r } define float @frem_nan_op1(float %x) { @@ -91,6 +109,24 @@ define float @frem_nan_op1(float %x) { ret float %r } +; Special-case: fneg must only change the sign bit (this is handled by constant folding). + +define double @fneg_nan_1(double %x) { +; CHECK-LABEL: @fneg_nan_1( +; CHECK-NEXT: ret double 0xFFFABCDEF0123456 +; + %r = fsub double -0.0, 0x7FFABCDEF0123456 + ret double %r +} + +define <2 x double> @fneg_nan_2(<2 x double> %x) { +; CHECK-LABEL: @fneg_nan_2( +; CHECK-NEXT: ret <2 x double> +; + %r = fsub <2 x double> , + ret <2 x double> %r +} + ; Repeat all tests with fast-math-flags. Alternate 'nnan' and 'fast' for more coverage. define float @fadd_nan_op0_nnan(float %x) {