1; RUN: opt -instcombine -S < %s | FileCheck %s 2 3; -------------------------------------------------------------------- 4; llvm.amdgcn.rcp 5; -------------------------------------------------------------------- 6 7declare float @llvm.amdgcn.rcp.f32(float) nounwind readnone 8declare double @llvm.amdgcn.rcp.f64(double) nounwind readnone 9 10 11; CHECK-LABEL: @test_constant_fold_rcp_f32_1 12; CHECK-NEXT: ret float 1.000000e+00 13define float @test_constant_fold_rcp_f32_1() nounwind { 14 %val = call float @llvm.amdgcn.rcp.f32(float 1.0) nounwind readnone 15 ret float %val 16} 17 18; CHECK-LABEL: @test_constant_fold_rcp_f64_1 19; CHECK-NEXT: ret double 1.000000e+00 20define double @test_constant_fold_rcp_f64_1() nounwind { 21 %val = call double @llvm.amdgcn.rcp.f64(double 1.0) nounwind readnone 22 ret double %val 23} 24 25; CHECK-LABEL: @test_constant_fold_rcp_f32_half 26; CHECK-NEXT: ret float 2.000000e+00 27define float @test_constant_fold_rcp_f32_half() nounwind { 28 %val = call float @llvm.amdgcn.rcp.f32(float 0.5) nounwind readnone 29 ret float %val 30} 31 32; CHECK-LABEL: @test_constant_fold_rcp_f64_half 33; CHECK-NEXT: ret double 2.000000e+00 34define double @test_constant_fold_rcp_f64_half() nounwind { 35 %val = call double @llvm.amdgcn.rcp.f64(double 0.5) nounwind readnone 36 ret double %val 37} 38 39; CHECK-LABEL: @test_constant_fold_rcp_f32_43 40; CHECK-NEXT: call float @llvm.amdgcn.rcp.f32(float 4.300000e+01) 41define float @test_constant_fold_rcp_f32_43() nounwind { 42 %val = call float @llvm.amdgcn.rcp.f32(float 4.300000e+01) nounwind readnone 43 ret float %val 44} 45 46; CHECK-LABEL: @test_constant_fold_rcp_f64_43 47; CHECK-NEXT: call double @llvm.amdgcn.rcp.f64(double 4.300000e+01) 48define double @test_constant_fold_rcp_f64_43() nounwind { 49 %val = call double @llvm.amdgcn.rcp.f64(double 4.300000e+01) nounwind readnone 50 ret double %val 51} 52 53 54; -------------------------------------------------------------------- 55; llvm.amdgcn.frexp.mant 56; -------------------------------------------------------------------- 57 58declare float @llvm.amdgcn.frexp.mant.f32(float) nounwind readnone 59declare double @llvm.amdgcn.frexp.mant.f64(double) nounwind readnone 60 61 62; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_undef( 63; CHECK-NEXT: ret float undef 64define float @test_constant_fold_frexp_mant_f32_undef() nounwind { 65 %val = call float @llvm.amdgcn.frexp.mant.f32(float undef) 66 ret float %val 67} 68 69; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_undef( 70; CHECK-NEXT: ret double undef 71define double @test_constant_fold_frexp_mant_f64_undef() nounwind { 72 %val = call double @llvm.amdgcn.frexp.mant.f64(double undef) 73 ret double %val 74} 75 76; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_0( 77; CHECK-NEXT: ret float 0.000000e+00 78define float @test_constant_fold_frexp_mant_f32_0() nounwind { 79 %val = call float @llvm.amdgcn.frexp.mant.f32(float 0.0) 80 ret float %val 81} 82 83; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_0( 84; CHECK-NEXT: ret double 0.000000e+00 85define double @test_constant_fold_frexp_mant_f64_0() nounwind { 86 %val = call double @llvm.amdgcn.frexp.mant.f64(double 0.0) 87 ret double %val 88} 89 90 91; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_n0( 92; CHECK-NEXT: ret float -0.000000e+00 93define float @test_constant_fold_frexp_mant_f32_n0() nounwind { 94 %val = call float @llvm.amdgcn.frexp.mant.f32(float -0.0) 95 ret float %val 96} 97 98; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_n0( 99; CHECK-NEXT: ret double -0.000000e+00 100define double @test_constant_fold_frexp_mant_f64_n0() nounwind { 101 %val = call double @llvm.amdgcn.frexp.mant.f64(double -0.0) 102 ret double %val 103} 104 105; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_1( 106; CHECK-NEXT: ret float 5.000000e-01 107define float @test_constant_fold_frexp_mant_f32_1() nounwind { 108 %val = call float @llvm.amdgcn.frexp.mant.f32(float 1.0) 109 ret float %val 110} 111 112; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_1( 113; CHECK-NEXT: ret double 5.000000e-01 114define double @test_constant_fold_frexp_mant_f64_1() nounwind { 115 %val = call double @llvm.amdgcn.frexp.mant.f64(double 1.0) 116 ret double %val 117} 118 119; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_n1( 120; CHECK-NEXT: ret float -5.000000e-01 121define float @test_constant_fold_frexp_mant_f32_n1() nounwind { 122 %val = call float @llvm.amdgcn.frexp.mant.f32(float -1.0) 123 ret float %val 124} 125 126; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_n1( 127; CHECK-NEXT: ret double -5.000000e-01 128define double @test_constant_fold_frexp_mant_f64_n1() nounwind { 129 %val = call double @llvm.amdgcn.frexp.mant.f64(double -1.0) 130 ret double %val 131} 132 133; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_nan( 134; CHECK-NEXT: ret float 0x7FF8000000000000 135define float @test_constant_fold_frexp_mant_f32_nan() nounwind { 136 %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x7FF8000000000000) 137 ret float %val 138} 139 140; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_nan( 141; CHECK-NEXT: ret double 0x7FF8000000000000 142define double @test_constant_fold_frexp_mant_f64_nan() nounwind { 143 %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FF8000000000000) 144 ret double %val 145} 146 147; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_inf( 148; CHECK-NEXT: ret float 0x7FF0000000000000 149define float @test_constant_fold_frexp_mant_f32_inf() nounwind { 150 %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x7FF0000000000000) 151 ret float %val 152} 153 154; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_inf( 155; CHECK-NEXT: ret double 0x7FF0000000000000 156define double @test_constant_fold_frexp_mant_f64_inf() nounwind { 157 %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FF0000000000000) 158 ret double %val 159} 160 161; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_ninf( 162; CHECK-NEXT: ret float 0xFFF0000000000000 163define float @test_constant_fold_frexp_mant_f32_ninf() nounwind { 164 %val = call float @llvm.amdgcn.frexp.mant.f32(float 0xFFF0000000000000) 165 ret float %val 166} 167 168; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_ninf( 169; CHECK-NEXT: ret double 0xFFF0000000000000 170define double @test_constant_fold_frexp_mant_f64_ninf() nounwind { 171 %val = call double @llvm.amdgcn.frexp.mant.f64(double 0xFFF0000000000000) 172 ret double %val 173} 174 175; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_max_num( 176; CHECK-NEXT: ret float 0x3FEFFFFFE0000000 177define float @test_constant_fold_frexp_mant_f32_max_num() nounwind { 178 %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x47EFFFFFE0000000) 179 ret float %val 180} 181 182; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_max_num( 183; CHECK-NEXT: ret double 0x3FEFFFFFFFFFFFFF 184define double @test_constant_fold_frexp_mant_f64_max_num() nounwind { 185 %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FEFFFFFFFFFFFFF) 186 ret double %val 187} 188 189; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_min_num( 190; CHECK-NEXT: ret float 5.000000e-01 191define float @test_constant_fold_frexp_mant_f32_min_num() nounwind { 192 %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x36A0000000000000) 193 ret float %val 194} 195 196; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_min_num( 197; CHECK-NEXT: ret double 5.000000e-01 198define double @test_constant_fold_frexp_mant_f64_min_num() nounwind { 199 %val = call double @llvm.amdgcn.frexp.mant.f64(double 4.940656e-324) 200 ret double %val 201} 202 203 204; -------------------------------------------------------------------- 205; llvm.amdgcn.frexp.exp 206; -------------------------------------------------------------------- 207 208declare i32 @llvm.amdgcn.frexp.exp.f32(float) nounwind readnone 209declare i32 @llvm.amdgcn.frexp.exp.f64(double) nounwind readnone 210 211; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_undef( 212; CHECK-NEXT: ret i32 undef 213define i32 @test_constant_fold_frexp_exp_f32_undef() nounwind { 214 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float undef) 215 ret i32 %val 216} 217 218; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_undef( 219; CHECK-NEXT: ret i32 undef 220define i32 @test_constant_fold_frexp_exp_f64_undef() nounwind { 221 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double undef) 222 ret i32 %val 223} 224 225; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_0( 226; CHECK-NEXT: ret i32 0 227define i32 @test_constant_fold_frexp_exp_f32_0() nounwind { 228 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0.0) 229 ret i32 %val 230} 231 232; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_0( 233; CHECK-NEXT: ret i32 0 234define i32 @test_constant_fold_frexp_exp_f64_0() nounwind { 235 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0.0) 236 ret i32 %val 237} 238 239; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_n0( 240; CHECK-NEXT: ret i32 0 241define i32 @test_constant_fold_frexp_exp_f32_n0() nounwind { 242 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float -0.0) 243 ret i32 %val 244} 245 246; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_n0( 247; CHECK-NEXT: ret i32 0 248define i32 @test_constant_fold_frexp_exp_f64_n0() nounwind { 249 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double -0.0) 250 ret i32 %val 251} 252 253; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_1024( 254; CHECK-NEXT: ret i32 11 255define i32 @test_constant_fold_frexp_exp_f32_1024() nounwind { 256 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 1024.0) 257 ret i32 %val 258} 259 260; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_1024( 261; CHECK-NEXT: ret i32 11 262define i32 @test_constant_fold_frexp_exp_f64_1024() nounwind { 263 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 1024.0) 264 ret i32 %val 265} 266 267; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_n1024( 268; CHECK-NEXT: ret i32 11 269define i32 @test_constant_fold_frexp_exp_f32_n1024() nounwind { 270 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float -1024.0) 271 ret i32 %val 272} 273 274; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_n1024( 275; CHECK-NEXT: ret i32 11 276define i32 @test_constant_fold_frexp_exp_f64_n1024() nounwind { 277 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double -1024.0) 278 ret i32 %val 279} 280 281; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_1_1024( 282; CHECK-NEXT: ret i32 -9 283define i32 @test_constant_fold_frexp_exp_f32_1_1024() nounwind { 284 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0.0009765625) 285 ret i32 %val 286} 287 288; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_1_1024( 289; CHECK-NEXT: ret i32 -9 290define i32 @test_constant_fold_frexp_exp_f64_1_1024() nounwind { 291 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0.0009765625) 292 ret i32 %val 293} 294 295; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_nan( 296; CHECK-NEXT: ret i32 0 297define i32 @test_constant_fold_frexp_exp_f32_nan() nounwind { 298 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x7FF8000000000000) 299 ret i32 %val 300} 301 302; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_nan( 303; CHECK-NEXT: ret i32 0 304define i32 @test_constant_fold_frexp_exp_f64_nan() nounwind { 305 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FF8000000000000) 306 ret i32 %val 307} 308 309; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_inf( 310; CHECK-NEXT: ret i32 0 311define i32 @test_constant_fold_frexp_exp_f32_inf() nounwind { 312 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x7FF0000000000000) 313 ret i32 %val 314} 315 316; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_inf( 317; CHECK-NEXT: ret i32 0 318define i32 @test_constant_fold_frexp_exp_f64_inf() nounwind { 319 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FF0000000000000) 320 ret i32 %val 321} 322 323; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_ninf( 324; CHECK-NEXT: ret i32 0 325define i32 @test_constant_fold_frexp_exp_f32_ninf() nounwind { 326 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0xFFF0000000000000) 327 ret i32 %val 328} 329 330; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_ninf( 331; CHECK-NEXT: ret i32 0 332define i32 @test_constant_fold_frexp_exp_f64_ninf() nounwind { 333 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0xFFF0000000000000) 334 ret i32 %val 335} 336 337; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_max_num( 338; CHECK-NEXT: ret i32 128 339define i32 @test_constant_fold_frexp_exp_f32_max_num() nounwind { 340 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x47EFFFFFE0000000) 341 ret i32 %val 342} 343 344; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_max_num( 345; CHECK-NEXT: ret i32 1024 346define i32 @test_constant_fold_frexp_exp_f64_max_num() nounwind { 347 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FEFFFFFFFFFFFFF) 348 ret i32 %val 349} 350 351; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_min_num( 352; CHECK-NEXT: ret i32 -148 353define i32 @test_constant_fold_frexp_exp_f32_min_num() nounwind { 354 %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x36A0000000000000) 355 ret i32 %val 356} 357 358; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_min_num( 359; CHECK-NEXT: ret i32 -1073 360define i32 @test_constant_fold_frexp_exp_f64_min_num() nounwind { 361 %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 4.940656e-324) 362 ret i32 %val 363} 364 365