1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 4; Test that floating point operations are not treated as sources of 5; poison. 6 7define float @freeze_fneg(float %arg) { 8; CHECK-LABEL: @freeze_fneg( 9; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 10; CHECK-NEXT: [[OP:%.*]] = fneg float [[ARG_FR]] 11; CHECK-NEXT: ret float [[OP]] 12; 13 %op = fneg float %arg 14 %freeze = freeze float %op 15 ret float %freeze 16} 17 18define float @freeze_fadd(float %arg0, float noundef %arg1) { 19; CHECK-LABEL: @freeze_fadd( 20; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 21; CHECK-NEXT: [[OP:%.*]] = fadd float [[ARG0_FR]], [[ARG1:%.*]] 22; CHECK-NEXT: ret float [[OP]] 23; 24 %op = fadd float %arg0, %arg1 25 %freeze = freeze float %op 26 ret float %freeze 27} 28 29define float @freeze_fsub(float %arg0, float noundef %arg1) { 30; CHECK-LABEL: @freeze_fsub( 31; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 32; CHECK-NEXT: [[OP:%.*]] = fsub float [[ARG0_FR]], [[ARG1:%.*]] 33; CHECK-NEXT: ret float [[OP]] 34; 35 %op = fsub float %arg0, %arg1 36 %freeze = freeze float %op 37 ret float %freeze 38} 39 40define float @freeze_fmul(float %arg0, float noundef %arg1) { 41; CHECK-LABEL: @freeze_fmul( 42; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 43; CHECK-NEXT: [[OP:%.*]] = fmul float [[ARG0_FR]], [[ARG1:%.*]] 44; CHECK-NEXT: ret float [[OP]] 45; 46 %op = fmul float %arg0, %arg1 47 %freeze = freeze float %op 48 ret float %freeze 49} 50 51define float @freeze_fdiv(float %arg0, float noundef %arg1) { 52; CHECK-LABEL: @freeze_fdiv( 53; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 54; CHECK-NEXT: [[OP:%.*]] = fdiv float [[ARG0_FR]], [[ARG1:%.*]] 55; CHECK-NEXT: ret float [[OP]] 56; 57 %op = fdiv float %arg0, %arg1 58 %freeze = freeze float %op 59 ret float %freeze 60} 61 62define float @freeze_frem(float %arg0, float noundef %arg1) { 63; CHECK-LABEL: @freeze_frem( 64; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 65; CHECK-NEXT: [[OP:%.*]] = fdiv float [[ARG0_FR]], [[ARG1:%.*]] 66; CHECK-NEXT: ret float [[OP]] 67; 68 %op = fdiv float %arg0, %arg1 69 %freeze = freeze float %op 70 ret float %freeze 71} 72 73define double @fpext(float %arg) { 74; CHECK-LABEL: @fpext( 75; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 76; CHECK-NEXT: [[OP:%.*]] = fpext float [[ARG_FR]] to double 77; CHECK-NEXT: ret double [[OP]] 78; 79 %op = fpext float %arg to double 80 %freeze = freeze double %op 81 ret double %freeze 82} 83 84define float @fptrunc(double %arg) { 85; CHECK-LABEL: @fptrunc( 86; CHECK-NEXT: [[ARG_FR:%.*]] = freeze double [[ARG:%.*]] 87; CHECK-NEXT: [[OP:%.*]] = fptrunc double [[ARG_FR]] to float 88; CHECK-NEXT: ret float [[OP]] 89; 90 %op = fptrunc double %arg to float 91 %freeze = freeze float %op 92 ret float %freeze 93} 94 95define float @sitofp(i32 %arg) { 96; CHECK-LABEL: @sitofp( 97; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]] 98; CHECK-NEXT: [[OP:%.*]] = sitofp i32 [[ARG_FR]] to float 99; CHECK-NEXT: ret float [[OP]] 100; 101 %op = sitofp i32 %arg to float 102 %freeze = freeze float %op 103 ret float %freeze 104} 105 106define float @uitofp(i32 %arg) { 107; CHECK-LABEL: @uitofp( 108; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i32 [[ARG:%.*]] 109; CHECK-NEXT: [[OP:%.*]] = uitofp i32 [[ARG_FR]] to float 110; CHECK-NEXT: ret float [[OP]] 111; 112 %op = uitofp i32 %arg to float 113 %freeze = freeze float %op 114 ret float %freeze 115} 116 117define float @freeze_fma(float %arg0, float noundef %arg1, float noundef %arg2) { 118; CHECK-LABEL: @freeze_fma( 119; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 120; CHECK-NEXT: [[OP:%.*]] = call float @llvm.fma.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]], float noundef [[ARG2:%.*]]) 121; CHECK-NEXT: ret float [[OP]] 122; 123 %op = call float @llvm.fma.f32(float %arg0, float noundef %arg1, float noundef %arg2) 124 %freeze = freeze float %op 125 ret float %freeze 126} 127 128define float @freeze_fmuladd(float %arg0, float noundef %arg1, float noundef %arg2) { 129; CHECK-LABEL: @freeze_fmuladd( 130; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 131; CHECK-NEXT: [[OP:%.*]] = call float @llvm.fmuladd.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]], float noundef [[ARG2:%.*]]) 132; CHECK-NEXT: ret float [[OP]] 133; 134 %op = call float @llvm.fmuladd.f32(float %arg0, float noundef %arg1, float noundef %arg2) 135 %freeze = freeze float %op 136 ret float %freeze 137} 138 139define float @freeze_sqrt(float %arg) { 140; CHECK-LABEL: @freeze_sqrt( 141; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 142; CHECK-NEXT: [[OP:%.*]] = call float @llvm.sqrt.f32(float [[ARG_FR]]) 143; CHECK-NEXT: ret float [[OP]] 144; 145 %op = call float @llvm.sqrt.f32(float %arg) 146 %freeze = freeze float %op 147 ret float %freeze 148} 149 150define float @freeze_powi(float %arg0, i32 %arg1) { 151; CHECK-LABEL: @freeze_powi( 152; CHECK-NEXT: [[OP:%.*]] = call float @llvm.powi.f32.i32(float [[ARG0:%.*]], i32 [[ARG1:%.*]]) 153; CHECK-NEXT: [[FREEZE:%.*]] = freeze float [[OP]] 154; CHECK-NEXT: ret float [[FREEZE]] 155; 156 %op = call float @llvm.powi.f32.i32(float %arg0, i32 %arg1) 157 %freeze = freeze float %op 158 ret float %freeze 159} 160 161define float @freeze_sin(float %arg) { 162; CHECK-LABEL: @freeze_sin( 163; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 164; CHECK-NEXT: [[OP:%.*]] = call float @llvm.sin.f32(float [[ARG_FR]]) 165; CHECK-NEXT: ret float [[OP]] 166; 167 %op = call float @llvm.sin.f32(float %arg) 168 %freeze = freeze float %op 169 ret float %freeze 170} 171 172define float @freeze_cos(float %arg) { 173; CHECK-LABEL: @freeze_cos( 174; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 175; CHECK-NEXT: [[OP:%.*]] = call float @llvm.cos.f32(float [[ARG_FR]]) 176; CHECK-NEXT: ret float [[OP]] 177; 178 %op = call float @llvm.cos.f32(float %arg) 179 %freeze = freeze float %op 180 ret float %freeze 181} 182 183define float @freeze_pow(float %arg0, float noundef %arg1) { 184; CHECK-LABEL: @freeze_pow( 185; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 186; CHECK-NEXT: [[OP:%.*]] = call float @llvm.pow.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]]) 187; CHECK-NEXT: ret float [[OP]] 188; 189 %op = call float @llvm.pow.f32(float %arg0, float noundef %arg1) 190 %freeze = freeze float %op 191 ret float %freeze 192} 193 194define float @freeze_log(float %arg) { 195; CHECK-LABEL: @freeze_log( 196; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 197; CHECK-NEXT: [[OP:%.*]] = call float @llvm.log.f32(float [[ARG_FR]]) 198; CHECK-NEXT: ret float [[OP]] 199; 200 %op = call float @llvm.log.f32(float %arg) 201 %freeze = freeze float %op 202 ret float %freeze 203} 204 205define float @freeze_log10(float %arg) { 206; CHECK-LABEL: @freeze_log10( 207; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 208; CHECK-NEXT: [[OP:%.*]] = call float @llvm.log10.f32(float [[ARG_FR]]) 209; CHECK-NEXT: ret float [[OP]] 210; 211 %op = call float @llvm.log10.f32(float %arg) 212 %freeze = freeze float %op 213 ret float %freeze 214} 215 216define float @freeze_log2(float %arg) { 217; CHECK-LABEL: @freeze_log2( 218; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 219; CHECK-NEXT: [[OP:%.*]] = call float @llvm.log2.f32(float [[ARG_FR]]) 220; CHECK-NEXT: ret float [[OP]] 221; 222 %op = call float @llvm.log2.f32(float %arg) 223 %freeze = freeze float %op 224 ret float %freeze 225} 226 227define float @freeze_exp(float %arg) { 228; CHECK-LABEL: @freeze_exp( 229; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 230; CHECK-NEXT: [[OP:%.*]] = call float @llvm.exp.f32(float [[ARG_FR]]) 231; CHECK-NEXT: ret float [[OP]] 232; 233 %op = call float @llvm.exp.f32(float %arg) 234 %freeze = freeze float %op 235 ret float %freeze 236} 237 238define float @freeze_exp2(float %arg) { 239; CHECK-LABEL: @freeze_exp2( 240; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 241; CHECK-NEXT: [[OP:%.*]] = call float @llvm.exp2.f32(float [[ARG_FR]]) 242; CHECK-NEXT: ret float [[OP]] 243; 244 %op = call float @llvm.exp2.f32(float %arg) 245 %freeze = freeze float %op 246 ret float %freeze 247} 248 249define float @freeze_exp10(float %arg) { 250; CHECK-LABEL: @freeze_exp10( 251; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 252; CHECK-NEXT: [[OP:%.*]] = call float @llvm.exp10.f32(float [[ARG_FR]]) 253; CHECK-NEXT: ret float [[OP]] 254; 255 %op = call float @llvm.exp10.f32(float %arg) 256 %freeze = freeze float %op 257 ret float %freeze 258} 259 260define float @freeze_fabs(float %arg) { 261; CHECK-LABEL: @freeze_fabs( 262; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 263; CHECK-NEXT: [[OP:%.*]] = call float @llvm.fabs.f32(float [[ARG_FR]]) 264; CHECK-NEXT: ret float [[OP]] 265; 266 %op = call float @llvm.fabs.f32(float %arg) 267 %freeze = freeze float %op 268 ret float %freeze 269} 270 271define float @freeze_copysign(float %arg0, float noundef %arg1) { 272; CHECK-LABEL: @freeze_copysign( 273; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 274; CHECK-NEXT: [[OP:%.*]] = call float @llvm.copysign.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]]) 275; CHECK-NEXT: ret float [[OP]] 276; 277 %op = call float @llvm.copysign.f32(float %arg0, float noundef %arg1) 278 %freeze = freeze float %op 279 ret float %freeze 280} 281 282define float @freeze_floor(float %arg) { 283; CHECK-LABEL: @freeze_floor( 284; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 285; CHECK-NEXT: [[OP:%.*]] = call float @llvm.floor.f32(float [[ARG_FR]]) 286; CHECK-NEXT: ret float [[OP]] 287; 288 %op = call float @llvm.floor.f32(float %arg) 289 %freeze = freeze float %op 290 ret float %freeze 291} 292 293define float @freeze_ceil(float %arg) { 294; CHECK-LABEL: @freeze_ceil( 295; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 296; CHECK-NEXT: [[OP:%.*]] = call float @llvm.ceil.f32(float [[ARG_FR]]) 297; CHECK-NEXT: ret float [[OP]] 298; 299 %op = call float @llvm.ceil.f32(float %arg) 300 %freeze = freeze float %op 301 ret float %freeze 302} 303 304define float @freeze_trunc(float %arg) { 305; CHECK-LABEL: @freeze_trunc( 306; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 307; CHECK-NEXT: [[OP:%.*]] = call float @llvm.trunc.f32(float [[ARG_FR]]) 308; CHECK-NEXT: ret float [[OP]] 309; 310 %op = call float @llvm.trunc.f32(float %arg) 311 %freeze = freeze float %op 312 ret float %freeze 313} 314 315define float @freeze_rint(float %arg) { 316; CHECK-LABEL: @freeze_rint( 317; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 318; CHECK-NEXT: [[OP:%.*]] = call float @llvm.rint.f32(float [[ARG_FR]]) 319; CHECK-NEXT: ret float [[OP]] 320; 321 %op = call float @llvm.rint.f32(float %arg) 322 %freeze = freeze float %op 323 ret float %freeze 324} 325 326define float @freeze_nearbyint(float %arg) { 327; CHECK-LABEL: @freeze_nearbyint( 328; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 329; CHECK-NEXT: [[OP:%.*]] = call float @llvm.nearbyint.f32(float [[ARG_FR]]) 330; CHECK-NEXT: ret float [[OP]] 331; 332 %op = call float @llvm.nearbyint.f32(float %arg) 333 %freeze = freeze float %op 334 ret float %freeze 335} 336 337define float @freeze_round(float %arg) { 338; CHECK-LABEL: @freeze_round( 339; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 340; CHECK-NEXT: [[OP:%.*]] = call float @llvm.round.f32(float [[ARG_FR]]) 341; CHECK-NEXT: ret float [[OP]] 342; 343 %op = call float @llvm.round.f32(float %arg) 344 %freeze = freeze float %op 345 ret float %freeze 346} 347 348define float @freeze_roundeven(float %arg) { 349; CHECK-LABEL: @freeze_roundeven( 350; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 351; CHECK-NEXT: [[OP:%.*]] = call float @llvm.roundeven.f32(float [[ARG_FR]]) 352; CHECK-NEXT: ret float [[OP]] 353; 354 %op = call float @llvm.roundeven.f32(float %arg) 355 %freeze = freeze float %op 356 ret float %freeze 357} 358 359define float @freeze_canonicalize(float %arg) { 360; CHECK-LABEL: @freeze_canonicalize( 361; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 362; CHECK-NEXT: [[OP:%.*]] = call float @llvm.canonicalize.f32(float [[ARG_FR]]) 363; CHECK-NEXT: ret float [[OP]] 364; 365 %op = call float @llvm.canonicalize.f32(float %arg) 366 %freeze = freeze float %op 367 ret float %freeze 368} 369 370define float @freeze_arithmetic_fence(float %arg) { 371; CHECK-LABEL: @freeze_arithmetic_fence( 372; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 373; CHECK-NEXT: [[OP:%.*]] = call float @llvm.arithmetic.fence.f32(float [[ARG_FR]]) 374; CHECK-NEXT: ret float [[OP]] 375; 376 %op = call float @llvm.arithmetic.fence.f32(float %arg) 377 %freeze = freeze float %op 378 ret float %freeze 379} 380 381define i32 @freeze_lround(float %arg) { 382; CHECK-LABEL: @freeze_lround( 383; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 384; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.lround.i32.f32(float [[ARG_FR]]) 385; CHECK-NEXT: ret i32 [[OP]] 386; 387 %op = call i32 @llvm.lround.i32.f32(float %arg) 388 %freeze = freeze i32 %op 389 ret i32 %freeze 390} 391 392define i32 @freeze_llround(float %arg) { 393; CHECK-LABEL: @freeze_llround( 394; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 395; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.llround.i32.f32(float [[ARG_FR]]) 396; CHECK-NEXT: ret i32 [[OP]] 397; 398 %op = call i32 @llvm.llround.i32.f32(float %arg) 399 %freeze = freeze i32 %op 400 ret i32 %freeze 401} 402 403define i32 @freeze_lrint(float %arg) { 404; CHECK-LABEL: @freeze_lrint( 405; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 406; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.lrint.i32.f32(float [[ARG_FR]]) 407; CHECK-NEXT: ret i32 [[OP]] 408; 409 %op = call i32 @llvm.lrint.i32.f32(float %arg) 410 %freeze = freeze i32 %op 411 ret i32 %freeze 412} 413 414define i32 @freeze_llrint(float %arg) { 415; CHECK-LABEL: @freeze_llrint( 416; CHECK-NEXT: [[ARG_FR:%.*]] = freeze float [[ARG:%.*]] 417; CHECK-NEXT: [[OP:%.*]] = call i32 @llvm.llrint.i32.f32(float [[ARG_FR]]) 418; CHECK-NEXT: ret i32 [[OP]] 419; 420 %op = call i32 @llvm.llrint.i32.f32(float %arg) 421 %freeze = freeze i32 %op 422 ret i32 %freeze 423} 424 425define i32 @freeze_noundef_lround(float %arg) { 426; CHECK-LABEL: @freeze_noundef_lround( 427; CHECK-NEXT: [[OP:%.*]] = call noundef i32 @llvm.lround.i32.f32(float [[ARG:%.*]]) 428; CHECK-NEXT: ret i32 [[OP]] 429; 430 %op = call noundef i32 @llvm.lround.i32.f32(float %arg) 431 %freeze = freeze i32 %op 432 ret i32 %freeze 433} 434 435define i32 @freeze_noundef_llround(float %arg) { 436; CHECK-LABEL: @freeze_noundef_llround( 437; CHECK-NEXT: [[OP:%.*]] = call noundef i32 @llvm.llround.i32.f32(float [[ARG:%.*]]) 438; CHECK-NEXT: ret i32 [[OP]] 439; 440 %op = call noundef i32 @llvm.llround.i32.f32(float %arg) 441 %freeze = freeze i32 %op 442 ret i32 %freeze 443} 444 445define i32 @freeze_noundef_lrint(float %arg) { 446; CHECK-LABEL: @freeze_noundef_lrint( 447; CHECK-NEXT: [[OP:%.*]] = call noundef i32 @llvm.lrint.i32.f32(float [[ARG:%.*]]) 448; CHECK-NEXT: ret i32 [[OP]] 449; 450 %op = call noundef i32 @llvm.lrint.i32.f32(float %arg) 451 %freeze = freeze i32 %op 452 ret i32 %freeze 453} 454 455define i32 @freeze_noundef_llrint(float %arg) { 456; CHECK-LABEL: @freeze_noundef_llrint( 457; CHECK-NEXT: [[OP:%.*]] = call noundef i32 @llvm.llrint.i32.f32(float [[ARG:%.*]]) 458; CHECK-NEXT: ret i32 [[OP]] 459; 460 %op = call noundef i32 @llvm.llrint.i32.f32(float %arg) 461 %freeze = freeze i32 %op 462 ret i32 %freeze 463} 464 465define float @freeze_minnum(float %arg0, float noundef %arg1) { 466; CHECK-LABEL: @freeze_minnum( 467; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 468; CHECK-NEXT: [[OP:%.*]] = call float @llvm.minnum.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]]) 469; CHECK-NEXT: ret float [[OP]] 470; 471 %op = call float @llvm.minnum.f32(float %arg0, float noundef %arg1) 472 %freeze = freeze float %op 473 ret float %freeze 474} 475 476define float @freeze_maxnum(float %arg0, float noundef %arg1) { 477; CHECK-LABEL: @freeze_maxnum( 478; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 479; CHECK-NEXT: [[OP:%.*]] = call float @llvm.maxnum.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]]) 480; CHECK-NEXT: ret float [[OP]] 481; 482 %op = call float @llvm.maxnum.f32(float %arg0, float noundef %arg1) 483 %freeze = freeze float %op 484 ret float %freeze 485} 486 487define float @freeze_minimum(float %arg0, float noundef %arg1) { 488; CHECK-LABEL: @freeze_minimum( 489; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 490; CHECK-NEXT: [[OP:%.*]] = call float @llvm.minimum.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]]) 491; CHECK-NEXT: ret float [[OP]] 492; 493 %op = call float @llvm.minimum.f32(float %arg0, float noundef %arg1) 494 %freeze = freeze float %op 495 ret float %freeze 496} 497 498define float @freeze_maximum(float %arg0, float noundef %arg1) { 499; CHECK-LABEL: @freeze_maximum( 500; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 501; CHECK-NEXT: [[OP:%.*]] = call float @llvm.maximum.f32(float [[ARG0_FR]], float noundef [[ARG1:%.*]]) 502; CHECK-NEXT: ret float [[OP]] 503; 504 %op = call float @llvm.maximum.f32(float %arg0, float noundef %arg1) 505 %freeze = freeze float %op 506 ret float %freeze 507} 508 509define i1 @freeze_isfpclass(float %arg0) { 510; CHECK-LABEL: @freeze_isfpclass( 511; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 512; CHECK-NEXT: [[OP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG0_FR]], i32 27) 513; CHECK-NEXT: ret i1 [[OP]] 514; 515 %op = call i1 @llvm.is.fpclass.f32(float %arg0, i32 27) 516 %freeze = freeze i1 %op 517 ret i1 %freeze 518} 519 520define float @freeze_fptrunc_round(double %arg0) { 521; CHECK-LABEL: @freeze_fptrunc_round( 522; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze double [[ARG0:%.*]] 523; CHECK-NEXT: [[OP:%.*]] = call float @llvm.fptrunc.round.f32.f64(double [[ARG0_FR]], metadata !"round.downward") 524; CHECK-NEXT: ret float [[OP]] 525; 526 %op = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward") 527 %freeze = freeze float %op 528 ret float %freeze 529} 530 531define float @freeze_ldexp(float %arg0, i32 noundef %arg1) { 532; CHECK-LABEL: @freeze_ldexp( 533; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 534; CHECK-NEXT: [[OP:%.*]] = call float @llvm.ldexp.f32.i32(float [[ARG0_FR]], i32 [[ARG1:%.*]]) 535; CHECK-NEXT: ret float [[OP]] 536; 537 %op = call float @llvm.ldexp.f32.i32(float %arg0, i32 %arg1) 538 %freeze = freeze float %op 539 ret float %freeze 540} 541 542define { float, i32 } @freeze_frexp(float %arg0) { 543; CHECK-LABEL: @freeze_frexp( 544; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 545; CHECK-NEXT: [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]]) 546; CHECK-NEXT: ret { float, i32 } [[OP]] 547; 548 %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 549 %freeze = freeze { float, i32 } %op 550 ret { float, i32 } %freeze 551} 552 553define float @freeze_frexp_0(float %arg0) { 554; CHECK-LABEL: @freeze_frexp_0( 555; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 556; CHECK-NEXT: [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]]) 557; CHECK-NEXT: [[EXTRACT_0:%.*]] = extractvalue { float, i32 } [[OP]], 0 558; CHECK-NEXT: ret float [[EXTRACT_0]] 559; 560 %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 561 %extract.0 = extractvalue { float, i32 } %op, 0 562 %freeze = freeze float %extract.0 563 ret float %freeze 564} 565 566define i32 @freeze_frexp_1(float %arg0) { 567; CHECK-LABEL: @freeze_frexp_1( 568; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]] 569; CHECK-NEXT: [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]]) 570; CHECK-NEXT: [[EXTRACT_1:%.*]] = extractvalue { float, i32 } [[OP]], 1 571; CHECK-NEXT: ret i32 [[EXTRACT_1]] 572; 573 %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 574 %extract.1 = extractvalue { float, i32 } %op, 1 575 %freeze = freeze i32 %extract.1 576 ret i32 %freeze 577} 578 579declare float @llvm.fma.f32(float, float, float) 580declare float @llvm.fmuladd.f32(float, float, float) 581declare float @llvm.sqrt.f32(float) 582declare float @llvm.powi.f32.i32(float, i32) 583declare float @llvm.sin.f32(float) 584declare float @llvm.cos.f32(float) 585declare float @llvm.pow.f32(float, float) 586declare float @llvm.log.f32(float) 587declare float @llvm.log10.f32(float) 588declare float @llvm.log2.f32(float) 589declare float @llvm.exp.f32(float) 590declare float @llvm.exp2.f32(float) 591declare float @llvm.exp10.f32(float) 592declare float @llvm.fabs.f32(float) 593declare float @llvm.copysign.f32(float, float) 594declare float @llvm.floor.f32(float) 595declare float @llvm.ceil.f32(float) 596declare float @llvm.trunc.f32(float) 597declare float @llvm.rint.f32(float) 598declare float @llvm.nearbyint.f32(float) 599declare float @llvm.round.f32(float) 600declare float @llvm.roundeven.f32(float) 601declare float @llvm.canonicalize.f32(float) 602declare float @llvm.arithmetic.fence.f32(float) 603declare i32 @llvm.lround.i32.f32(float) 604declare i32 @llvm.llround.i32.f32(float) 605declare i32 @llvm.lrint.i32.f32(float) 606declare i32 @llvm.llrint.i32.f32(float) 607declare float @llvm.minnum.f32(float, float) 608declare float @llvm.maxnum.f32(float, float) 609declare float @llvm.minimum.f32(float, float) 610declare float @llvm.maximum.f32(float, float) 611declare i1 @llvm.is.fpclass.f32(float, i32 immarg) 612declare float @llvm.fptrunc.round.f32.f64(double, metadata) 613declare float @llvm.ldexp.f32.i32(float, i32) 614declare { float, i32 } @llvm.frexp.f32.i32(float) 615