1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4; Default NaN constant 5 6define double @fadd_nan_op0(double %x) { 7; CHECK-LABEL: @fadd_nan_op0( 8; CHECK-NEXT: ret double 0x7FF8000000000000 9; 10 %r = fadd double 0x7FF8000000000000, %x 11 ret double %r 12} 13 14; Sign bit is set 15 16define double @fadd_nan_op1(double %x) { 17; CHECK-LABEL: @fadd_nan_op1( 18; CHECK-NEXT: ret double 0xFFF8000000000000 19; 20 %r = fadd double %x, 0xFFF8000000000000 21 ret double %r 22} 23 24; Non-zero payload 25 26define float @fsub_nan_op0(float %x) { 27; CHECK-LABEL: @fsub_nan_op0( 28; CHECK-NEXT: ret float 0x7FFFFF0000000000 29; 30 %r = fsub float 0x7FFFFF0000000000, %x 31 ret float %r 32} 33 34; Signaling - make quiet and preserve the payload and signbit 35 36define float @fsub_nan_op1(float %x) { 37; CHECK-LABEL: @fsub_nan_op1( 38; CHECK-NEXT: ret float 0x7FF9000000000000 39; 40 %r = fsub float %x, 0x7FF1000000000000 41 ret float %r 42} 43 44define <2 x float> @fsub_nan_op1_vec(<2 x float> %x) { 45; CHECK-LABEL: @fsub_nan_op1_vec( 46; CHECK-NEXT: ret <2 x float> <float 0x7FF9000000000000, float 0xFFF9000000000000> 47; 48 %r = fsub <2 x float> %x, <float 0x7FF1000000000000, float 0xFFF1000000000000> 49 ret <2 x float> %r 50} 51 52define <vscale x 1 x float> @fsub_nan_op1_scalable_vec_0(<vscale x 1 x float> %x) { 53; CHECK-LABEL: @fsub_nan_op1_scalable_vec_0( 54; CHECK-NEXT: ret <vscale x 1 x float> splat (float 0x7FF9000000000000) 55; 56 %r = fsub <vscale x 1 x float> %x, splat (float 0x7FF1000000000000) 57 ret <vscale x 1 x float> %r 58} 59 60define <vscale x 1 x float> @fsub_nan_op1_scalable_vec_1(<vscale x 1 x float> %x) { 61; CHECK-LABEL: @fsub_nan_op1_scalable_vec_1( 62; CHECK-NEXT: ret <vscale x 1 x float> splat (float 0xFFF9000000000000) 63; 64 %r = fsub <vscale x 1 x float> %x, splat (float 0xFFF1000000000000) 65 ret <vscale x 1 x float> %r 66} 67 68; Signaling and signed - make quiet and preserve the payload and signbit 69 70define double @fmul_nan_op0(double %x) { 71; CHECK-LABEL: @fmul_nan_op0( 72; CHECK-NEXT: ret double 0xFFF8000000000001 73; 74 %r = fmul double 0xFFF0000000000001, %x 75 ret double %r 76} 77 78define <2 x double> @fmul_nan_op0_vec(<2 x double> %x) { 79; CHECK-LABEL: @fmul_nan_op0_vec( 80; CHECK-NEXT: ret <2 x double> <double 0xFFF8000000000001, double 0xFFF8DEADDEADDEAD> 81; 82 %r = fmul <2 x double> <double 0xFFF0000000000001, double 0xFFF0DEADDEADDEAD>, %x 83 ret <2 x double> %r 84} 85 86define <vscale x 1 x double> @fmul_nan_op0_scalable_vec_0(<vscale x 1 x double> %x) { 87; CHECK-LABEL: @fmul_nan_op0_scalable_vec_0( 88; CHECK-NEXT: ret <vscale x 1 x double> splat (double 0xFFF8000000000001) 89; 90 %r = fmul <vscale x 1 x double> splat (double 0xFFF0000000000001), %x 91 ret <vscale x 1 x double> %r 92} 93 94define <vscale x 1 x double> @fmul_nan_op0_scalable_vec_1(<vscale x 1 x double> %x) { 95; CHECK-LABEL: @fmul_nan_op0_scalable_vec_1( 96; CHECK-NEXT: ret <vscale x 1 x double> splat (double 0xFFF8DEADDEADDEAD) 97; 98 %r = fmul <vscale x 1 x double> splat (double 0xFFF0DEADDEADDEAD), %x 99 ret <vscale x 1 x double> %r 100} 101 102; Vector type 103 104define <2 x float> @fmul_nan_op1(<2 x float> %x) { 105; CHECK-LABEL: @fmul_nan_op1( 106; CHECK-NEXT: ret <2 x float> splat (float 0x7FF8000000000000) 107; 108 %r = fmul <2 x float> %x, <float 0x7FF8000000000000, float 0x7FF8000000000000> 109 ret <2 x float> %r 110} 111 112define <vscale x 1 x double> @fmul_nan_op1_scalable_vec(<vscale x 1 x double> %x) { 113; CHECK-LABEL: @fmul_nan_op1_scalable_vec( 114; CHECK-NEXT: ret <vscale x 1 x double> splat (double 0x7FF8000000000000) 115; 116 %r = fmul <vscale x 1 x double> %x, splat (double 0x7FF8000000000000) 117 ret <vscale x 1 x double> %r 118} 119 120; Vector signed and non-zero payload 121 122define <2 x double> @fdiv_nan_op0(<2 x double> %x) { 123; CHECK-LABEL: @fdiv_nan_op0( 124; CHECK-NEXT: ret <2 x double> splat (double 0xFFF800000000000F) 125; 126 %r = fdiv <2 x double> <double 0xFFF800000000000F, double 0xFFF800000000000F>, %x 127 ret <2 x double> %r 128} 129 130define <vscale x 1 x double> @fdivl_nan_op0_scalable_vec(<vscale x 1 x double> %x) { 131; CHECK-LABEL: @fdivl_nan_op0_scalable_vec( 132; CHECK-NEXT: ret <vscale x 1 x double> splat (double 0xFFF800000000000F) 133; 134 %r = fdiv <vscale x 1 x double> splat (double 0xFFF800000000000F), %x 135 ret <vscale x 1 x double> %r 136} 137 138; Vector with different NaN constant elements 139 140define <2 x half> @fdiv_nan_op1(<2 x half> %x) { 141; CHECK-LABEL: @fdiv_nan_op1( 142; CHECK-NEXT: ret <2 x half> <half 0xH7FFF, half 0xHFF00> 143; 144 %r = fdiv <2 x half> %x, <half 0xH7FFF, half 0xHFF00> 145 ret <2 x half> %r 146} 147 148define <vscale x 1 x half> @fdiv_nan_op1_scalable_vec(<vscale x 1 x half> %x) { 149; CHECK-LABEL: @fdiv_nan_op1_scalable_vec( 150; CHECK-NEXT: ret <vscale x 1 x half> splat (half 0xH7FFF) 151; 152 %r = fdiv <vscale x 1 x half> %x, splat (half 0xH7FFF) 153 ret <vscale x 1 x half> %r 154} 155 156; Vector with poison element 157 158define <2 x double> @fsub_nan_poison_op1(<2 x double> %x) { 159; CHECK-LABEL: @fsub_nan_poison_op1( 160; CHECK-NEXT: ret <2 x double> <double 0xFFFF00000000DEAD, double poison> 161; 162 %r = fsub <2 x double> %x, <double 0xFFFF00000000DEAD, double poison> 163 ret <2 x double> %r 164} 165 166; Vector with poison element 167 168define <2 x double> @frem_nan_poison_op0(<2 x double> %x) { 169; CHECK-LABEL: @frem_nan_poison_op0( 170; CHECK-NEXT: ret <2 x double> <double 0xFFFF00000000DEAD, double poison> 171; 172 %r = frem <2 x double> <double 0xFFFF00000000DEAD, double poison>, %x 173 ret <2 x double> %r 174} 175 176; Vector with poison and undef elements 177 178define <3 x double> @fadd_nan_poison_undef_op1(<3 x double> %x) { 179; CHECK-LABEL: @fadd_nan_poison_undef_op1( 180; CHECK-NEXT: [[R:%.*]] = fadd <3 x double> [[X:%.*]], <double 0xFFFF00000000DEAD, double poison, double undef> 181; CHECK-NEXT: ret <3 x double> [[R]] 182; 183 %r = fadd <3 x double> %x, <double 0xFFFF00000000DEAD, double poison, double undef> 184 ret <3 x double> %r 185} 186 187define float @frem_nan_op1(float %x) { 188; CHECK-LABEL: @frem_nan_op1( 189; CHECK-NEXT: ret float 0x7FF8000000000000 190; 191 %r = frem float %x, 0x7FF8000000000000 192 ret float %r 193} 194 195; Special-case: fneg must only change the sign bit (this is handled by constant folding). 196 197define double @fneg_nan_1(double %x) { 198; CHECK-LABEL: @fneg_nan_1( 199; CHECK-NEXT: ret double 0x7FFABCDEF0123456 200; 201 %r = fsub double -0.0, 0x7FFABCDEF0123456 202 ret double %r 203} 204 205define double @unary_fneg_nan_1(double %x) { 206; CHECK-LABEL: @unary_fneg_nan_1( 207; CHECK-NEXT: ret double 0xFFFABCDEF0123456 208; 209 %r = fneg double 0x7FFABCDEF0123456 210 ret double %r 211} 212 213define <2 x double> @fneg_nan_2(<2 x double> %x) { 214; CHECK-LABEL: @fneg_nan_2( 215; CHECK-NEXT: ret <2 x double> <double 0xFFF9234567890ABC, double 0x7FF8000000000001> 216; 217 %r = fsub <2 x double> <double -0.0, double -0.0>, <double 0xFFF1234567890ABC, double 0x7FF0000000000001> 218 ret <2 x double> %r 219} 220 221define <vscale x 1 x double> @fneg_nan_2_scalable_vec() { 222; CHECK-LABEL: @fneg_nan_2_scalable_vec( 223; CHECK-NEXT: ret <vscale x 1 x double> splat (double 0xFFF9234567890ABC) 224; 225 %r = fsub <vscale x 1 x double> splat (double -0.0), splat (double 0xFFF1234567890ABC) 226 ret <vscale x 1 x double> %r 227} 228 229define <2 x double> @unary_fneg_nan_2(<2 x double> %x) { 230; CHECK-LABEL: @unary_fneg_nan_2( 231; CHECK-NEXT: ret <2 x double> <double 0x7FF1234567890ABC, double 0xFFF0000000000001> 232; 233 %r = fneg <2 x double> <double 0xFFF1234567890ABC, double 0x7FF0000000000001> 234 ret <2 x double> %r 235} 236 237; FIXME: This doesn't behave the same way as the fixed-length vectors above 238define <vscale x 1 x double> @unary_fneg_nan_2_scalable_vec_0() { 239; CHECK-LABEL: @unary_fneg_nan_2_scalable_vec_0( 240; CHECK-NEXT: ret <vscale x 1 x double> splat (double 0x7FF1234567890ABC) 241; 242 %r = fneg <vscale x 1 x double> splat (double 0xFFF1234567890ABC) 243 ret <vscale x 1 x double> %r 244} 245 246; FIXME: This doesn't behave the same way as the fixed-length vectors above 247define <vscale x 1 x double> @unary_fneg_nan_2_scalable_vec_1() { 248; CHECK-LABEL: @unary_fneg_nan_2_scalable_vec_1( 249; CHECK-NEXT: ret <vscale x 1 x double> splat (double 0xFFF0000000000001) 250; 251 %r = fneg <vscale x 1 x double> splat (double 0x7FF0000000000001) 252 ret <vscale x 1 x double> %r 253} 254 255; Repeat all tests with fast-math-flags. Alternate 'nnan' and 'fast' for more coverage. 256 257define float @fadd_nan_op0_nnan(float %x) { 258; CHECK-LABEL: @fadd_nan_op0_nnan( 259; CHECK-NEXT: ret float poison 260; 261 %r = fadd nnan float 0x7FF8000000000000, %x 262 ret float %r 263} 264 265define float @fadd_nan_op1_fast(float %x) { 266; CHECK-LABEL: @fadd_nan_op1_fast( 267; CHECK-NEXT: ret float poison 268; 269 %r = fadd fast float %x, 0x7FF8000000000000 270 ret float %r 271} 272 273define float @fsub_nan_op0_fast(float %x) { 274; CHECK-LABEL: @fsub_nan_op0_fast( 275; CHECK-NEXT: ret float poison 276; 277 %r = fsub fast float 0x7FF8000000000000, %x 278 ret float %r 279} 280 281define float @fsub_nan_op1_nnan(float %x) { 282; CHECK-LABEL: @fsub_nan_op1_nnan( 283; CHECK-NEXT: ret float poison 284; 285 %r = fsub nnan float %x, 0x7FF8000000000000 286 ret float %r 287} 288 289define float @fmul_nan_op0_nnan(float %x) { 290; CHECK-LABEL: @fmul_nan_op0_nnan( 291; CHECK-NEXT: ret float poison 292; 293 %r = fmul nnan float 0x7FF8000000000000, %x 294 ret float %r 295} 296 297define float @fmul_nan_op1_fast(float %x) { 298; CHECK-LABEL: @fmul_nan_op1_fast( 299; CHECK-NEXT: ret float poison 300; 301 %r = fmul fast float %x, 0x7FF8000000000000 302 ret float %r 303} 304 305define float @fdiv_nan_op0_fast(float %x) { 306; CHECK-LABEL: @fdiv_nan_op0_fast( 307; CHECK-NEXT: ret float poison 308; 309 %r = fdiv fast float 0x7FF8000000000000, %x 310 ret float %r 311} 312 313define float @fdiv_nan_op1_nnan(float %x) { 314; CHECK-LABEL: @fdiv_nan_op1_nnan( 315; CHECK-NEXT: ret float poison 316; 317 %r = fdiv nnan float %x, 0x7FF8000000000000 318 ret float %r 319} 320 321define float @frem_nan_op0_nnan(float %x) { 322; CHECK-LABEL: @frem_nan_op0_nnan( 323; CHECK-NEXT: ret float poison 324; 325 %r = frem nnan float 0x7FF8000000000000, %x 326 ret float %r 327} 328 329define float @frem_nan_op1_fast(float %x) { 330; CHECK-LABEL: @frem_nan_op1_fast( 331; CHECK-NEXT: ret float poison 332; 333 %r = frem fast float %x, 0x7FF8000000000000 334 ret float %r 335} 336 337