1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT 3 4define float @ret_frem_ieee(float %arg0, float %arg1) #0 { 5; CHECK-LABEL: define float @ret_frem_ieee 6; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0:[0-9]+]] { 7; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 8; CHECK-NEXT: ret float [[FREM]] 9; 10 %frem = frem float %arg0, %arg1 11 ret float %frem 12} 13 14define float @ret_frem_daz(float %arg0, float %arg1) #1 { 15; CHECK-LABEL: define float @ret_frem_daz 16; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1:[0-9]+]] { 17; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 18; CHECK-NEXT: ret float [[FREM]] 19; 20 %frem = frem float %arg0, %arg1 21 ret float %frem 22} 23 24define float @ret_frem_ieee_noinf_nozero__all(float nofpclass(inf zero) %arg0, float %arg1) #0 { 25; CHECK-LABEL: define float @ret_frem_ieee_noinf_nozero__all 26; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] { 27; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 28; CHECK-NEXT: ret float [[FREM]] 29; 30 %frem = frem float %arg0, %arg1 31 ret float %frem 32} 33 34define float @ret_frem_ieee_nonan_noinf_nozero__all(float nofpclass(nan inf zero) %arg0, float %arg1) #0 { 35; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_nozero__all 36; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] { 37; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 38; CHECK-NEXT: ret float [[FREM]] 39; 40 %frem = frem float %arg0, %arg1 41 ret float %frem 42} 43 44define float @ret_frem_ieee_all__nonan_noinf_nozero(float %arg0, float nofpclass(nan inf zero) %arg1) #0 { 45; CHECK-LABEL: define float @ret_frem_ieee_all__nonan_noinf_nozero 46; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR0]] { 47; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 48; CHECK-NEXT: ret float [[FREM]] 49; 50 %frem = frem float %arg0, %arg1 51 ret float %frem 52} 53 54define float @ret_frem_ieee_nonan_noinf_nozero__nonan(float nofpclass(nan inf zero) %arg0, float nofpclass(nan) %arg1) #0 { 55; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_nozero__nonan 56; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR0]] { 57; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 58; CHECK-NEXT: ret float [[FREM]] 59; 60 %frem = frem float %arg0, %arg1 61 ret float %frem 62} 63 64define float @ret_frem_ieee_nonan__nonan_noinf_nozero(float nofpclass(nan) %arg0, float nofpclass(nan inf zero) %arg1) #0 { 65; CHECK-LABEL: define float @ret_frem_ieee_nonan__nonan_noinf_nozero 66; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR0]] { 67; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 68; CHECK-NEXT: ret float [[FREM]] 69; 70 %frem = frem float %arg0, %arg1 71 ret float %frem 72} 73 74define float @ret_frem_ieee_nonan_nozero__nonan_noinf(float nofpclass(nan zero) %arg0, float nofpclass(nan inf) %arg1) #0 { 75; CHECK-LABEL: define float @ret_frem_ieee_nonan_nozero__nonan_noinf 76; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] { 77; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 78; CHECK-NEXT: ret float [[FREM]] 79; 80 %frem = frem float %arg0, %arg1 81 ret float %frem 82} 83 84define float @ret_frem_ieee_nonan_noinf__nonan_nozero(float nofpclass(nan inf) %arg0, float nofpclass(nan zero) %arg1) #0 { 85; CHECK-LABEL: define nofpclass(nan) float @ret_frem_ieee_nonan_noinf__nonan_nozero 86; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero) [[ARG1:%.*]]) #[[ATTR0]] { 87; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 88; CHECK-NEXT: ret float [[FREM]] 89; 90 %frem = frem float %arg0, %arg1 91 ret float %frem 92} 93 94define float @ret_frem_daz_nonan_nozero__nonan_noinf(float nofpclass(nan zero) %arg0, float nofpclass(nan inf) %arg1) #1 { 95; CHECK-LABEL: define float @ret_frem_daz_nonan_nozero__nonan_noinf 96; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR1]] { 97; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 98; CHECK-NEXT: ret float [[FREM]] 99; 100 %frem = frem float %arg0, %arg1 101 ret float %frem 102} 103 104define float @ret_frem_daz_nonan_noinf__nonan_nozero(float nofpclass(nan inf) %arg0, float nofpclass(nan zero) %arg1) #1 { 105; CHECK-LABEL: define float @ret_frem_daz_nonan_noinf__nonan_nozero 106; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero) [[ARG1:%.*]]) #[[ATTR1]] { 107; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 108; CHECK-NEXT: ret float [[FREM]] 109; 110 %frem = frem float %arg0, %arg1 111 ret float %frem 112} 113 114define float @ret_frem_daz_nonan_nozero_nosub__nonan_noinf(float nofpclass(nan zero sub) %arg0, float nofpclass(nan inf) %arg1) #1 { 115; CHECK-LABEL: define float @ret_frem_daz_nonan_nozero_nosub__nonan_noinf 116; CHECK-SAME: (float nofpclass(nan zero sub) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR1]] { 117; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 118; CHECK-NEXT: ret float [[FREM]] 119; 120 %frem = frem float %arg0, %arg1 121 ret float %frem 122} 123 124define float @ret_frem_daz_nonan_noinf__nonan_nozero_nosub(float nofpclass(nan inf) %arg0, float nofpclass(nan zero sub) %arg1) #1 { 125; CHECK-LABEL: define nofpclass(nan) float @ret_frem_daz_nonan_noinf__nonan_nozero_nosub 126; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero sub) [[ARG1:%.*]]) #[[ATTR1]] { 127; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 128; CHECK-NEXT: ret float [[FREM]] 129; 130 %frem = frem float %arg0, %arg1 131 ret float %frem 132} 133 134define float @ret_frem_ieee_nonan_noinf__nonan_noinf(float nofpclass(nan) %arg0, float nofpclass(nan) %arg1) #0 { 135; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf__nonan_noinf 136; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR0]] { 137; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 138; CHECK-NEXT: ret float [[FREM]] 139; 140 %frem = frem float %arg0, %arg1 141 ret float %frem 142} 143 144define float @ret_frem_ieee_nonan_noinf_nozero__nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero) %arg1) #0 { 145; CHECK-LABEL: define nofpclass(nan) float @ret_frem_ieee_nonan_noinf_nozero__nonan_noinf_nozero 146; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR0]] { 147; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 148; CHECK-NEXT: ret float [[FREM]] 149; 150 %frem = frem float %arg0, %arg1 151 ret float %frem 152} 153 154define float @ret_frem_daz_nonan_noinf_nozero__nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero) %arg1) #1 { 155; CHECK-LABEL: define float @ret_frem_daz_nonan_noinf_nozero__nonan_noinf_nozero 156; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR1]] { 157; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 158; CHECK-NEXT: ret float [[FREM]] 159; 160 %frem = frem float %arg0, %arg1 161 ret float %frem 162} 163 164define float @ret_frem_dapz_nonan_noinf_nozero__nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero) %arg1) #2 { 165; CHECK-LABEL: define float @ret_frem_dapz_nonan_noinf_nozero__nonan_noinf_nozero 166; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR2:[0-9]+]] { 167; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 168; CHECK-NEXT: ret float [[FREM]] 169; 170 %frem = frem float %arg0, %arg1 171 ret float %frem 172} 173 174define float @ret_frem_dynamic_nonan_noinf_nozero__nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero) %arg1) #3 { 175; CHECK-LABEL: define float @ret_frem_dynamic_nonan_noinf_nozero__nonan_noinf_nozero 176; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR3:[0-9]+]] { 177; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 178; CHECK-NEXT: ret float [[FREM]] 179; 180 %frem = frem float %arg0, %arg1 181 ret float %frem 182} 183 184define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_noinf(float nofpclass(nan inf) %arg0, float nofpclass(nan inf) %arg1) #0 { 185; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_noinf 186; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] { 187; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 188; CHECK-NEXT: ret float [[FREM]] 189; 190 %frem = frem float %arg0, %arg1 191 ret float %frem 192} 193 194define float @ret_frem_ieee_nonan_noinf_nozero__nonan_noinf_noinf(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf) %arg1) #0 { 195; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_nozero__nonan_noinf_noinf 196; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] { 197; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 198; CHECK-NEXT: ret float [[FREM]] 199; 200 %frem = frem float %arg0, %arg1 201 ret float %frem 202} 203 204define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_nozero(float nofpclass(nan inf) %arg0, float nofpclass(nan inf zero) %arg1) #0 { 205; CHECK-LABEL: define nofpclass(nan) float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_nozero 206; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR0]] { 207; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 208; CHECK-NEXT: ret float [[FREM]] 209; 210 %frem = frem float %arg0, %arg1 211 ret float %frem 212} 213 214define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_noposzero(float nofpclass(nan inf) %arg0, float nofpclass(nan pzero) %arg1) #0 { 215; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_noposzero 216; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan pzero) [[ARG1:%.*]]) #[[ATTR0]] { 217; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 218; CHECK-NEXT: ret float [[FREM]] 219; 220 %frem = frem float %arg0, %arg1 221 ret float %frem 222} 223 224define float @ret_frem_ieee_nonan_noinf_noposzero__nonan_noinf_noinf(float nofpclass(nan pzero) %arg0, float nofpclass(nan inf) %arg1) #0 { 225; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_noposzero__nonan_noinf_noinf 226; CHECK-SAME: (float nofpclass(nan pzero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] { 227; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 228; CHECK-NEXT: ret float [[FREM]] 229; 230 %frem = frem float %arg0, %arg1 231 ret float %frem 232} 233 234define float @ret_frem_ieee_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero sub) %arg1) #0 { 235; CHECK-LABEL: define nofpclass(nan) float @ret_frem_ieee_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub 236; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR0]] { 237; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 238; CHECK-NEXT: ret float [[FREM]] 239; 240 %frem = frem float %arg0, %arg1 241 ret float %frem 242} 243 244; Denormal mode doesn't matter because sources are nofpclass(sub) 245define float @ret_frem_daz_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero sub) %arg1) #1 { 246; CHECK-LABEL: define nofpclass(nan) float @ret_frem_daz_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub 247; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR1]] { 248; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 249; CHECK-NEXT: ret float [[FREM]] 250; 251 %frem = frem float %arg0, %arg1 252 ret float %frem 253} 254 255define float @ret_frem_dapz_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero sub) %arg1) #2 { 256; CHECK-LABEL: define nofpclass(nan) float @ret_frem_dapz_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub 257; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR2]] { 258; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 259; CHECK-NEXT: ret float [[FREM]] 260; 261 %frem = frem float %arg0, %arg1 262 ret float %frem 263} 264 265define float @ret_frem_dynamic_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero sub) %arg1) #3 { 266; CHECK-LABEL: define nofpclass(nan) float @ret_frem_dynamic_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub 267; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR3]] { 268; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 269; CHECK-NEXT: ret float [[FREM]] 270; 271 %frem = frem float %arg0, %arg1 272 ret float %frem 273} 274 275; Missing no-subnormal on lhs 276define float @ret_frem_daz_nonan_noinf_nozero__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero sub) %arg1) #1 { 277; CHECK-LABEL: define nofpclass(nan) float @ret_frem_daz_nonan_noinf_nozero__nonan_noinf_nozero_nosub 278; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR1]] { 279; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 280; CHECK-NEXT: ret float [[FREM]] 281; 282 %frem = frem float %arg0, %arg1 283 ret float %frem 284} 285 286; Missing no-subnormal on lhs 287define float @ret_frem_daz_nonan_noinf_nozero_nosub__nonan_noinf_nozero(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero) %arg1) #1 { 288; CHECK-LABEL: define float @ret_frem_daz_nonan_noinf_nozero_nosub__nonan_noinf_nozero 289; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR1]] { 290; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 291; CHECK-NEXT: ret float [[FREM]] 292; 293 %frem = frem float %arg0, %arg1 294 ret float %frem 295} 296 297; should be able to infer noinf 298define float @ret_frem_ieee_noinf__nozero(float nofpclass(inf) %arg0, float nofpclass(zero) %arg1) #0 { 299; CHECK-LABEL: define float @ret_frem_ieee_noinf__nozero 300; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR0]] { 301; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 302; CHECK-NEXT: ret float [[FREM]] 303; 304 %frem = frem float %arg0, %arg1 305 ret float %frem 306} 307 308define float @ret_frem_ieee_all__nozero(float %arg0, float nofpclass(zero) %arg1) #0 { 309; CHECK-LABEL: define float @ret_frem_ieee_all__nozero 310; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR0]] { 311; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 312; CHECK-NEXT: ret float [[FREM]] 313; 314 %frem = frem float %arg0, %arg1 315 ret float %frem 316} 317 318define float @ret_frem_ieee_noinf__all(float nofpclass(inf) %arg0, float %arg1) #0 { 319; CHECK-LABEL: define float @ret_frem_ieee_noinf__all 320; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] { 321; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 322; CHECK-NEXT: ret float [[FREM]] 323; 324 %frem = frem float %arg0, %arg1 325 ret float %frem 326} 327 328define float @ret_frem_ieee_nozero__noinf(float nofpclass(zero) %arg0, float nofpclass(inf) %arg1) #0 { 329; CHECK-LABEL: define float @ret_frem_ieee_nozero__noinf 330; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(inf) [[ARG1:%.*]]) #[[ATTR0]] { 331; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 332; CHECK-NEXT: ret float [[FREM]] 333; 334 %frem = frem float %arg0, %arg1 335 ret float %frem 336} 337 338define float @ret_frem_daz_noinf__nozero(float nofpclass(inf) %arg0, float nofpclass(zero) %arg1) #1 { 339; CHECK-LABEL: define float @ret_frem_daz_noinf__nozero 340; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR1]] { 341; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 342; CHECK-NEXT: ret float [[FREM]] 343; 344 %frem = frem float %arg0, %arg1 345 ret float %frem 346} 347 348define float @ret_frem_daz_noinf__nozero_nosub(float nofpclass(inf) %arg0, float nofpclass(zero sub) %arg1) #1 { 349; CHECK-LABEL: define float @ret_frem_daz_noinf__nozero_nosub 350; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(zero sub) [[ARG1:%.*]]) #[[ATTR1]] { 351; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 352; CHECK-NEXT: ret float [[FREM]] 353; 354 %frem = frem float %arg0, %arg1 355 ret float %frem 356} 357 358define float @ret_frem_same_operands(float %arg) #0 { 359; CHECK-LABEL: define nofpclass(inf sub norm) float @ret_frem_same_operands 360; CHECK-SAME: (float [[ARG:%.*]]) #[[ATTR0]] { 361; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG]], [[ARG]] 362; CHECK-NEXT: ret float [[FREM]] 363; 364 %frem = frem float %arg, %arg 365 ret float %frem 366} 367 368define float @ret_frem_same_operands_nosnan(float nofpclass(snan) %arg) #0 { 369; CHECK-LABEL: define nofpclass(inf sub norm) float @ret_frem_same_operands_nosnan 370; CHECK-SAME: (float nofpclass(snan) [[ARG:%.*]]) #[[ATTR0]] { 371; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG]], [[ARG]] 372; CHECK-NEXT: ret float [[FREM]] 373; 374 %frem = frem float %arg, %arg 375 ret float %frem 376} 377 378define float @ret_frem_same_operands_noqnan(float nofpclass(qnan) %arg) #0 { 379; CHECK-LABEL: define nofpclass(inf sub norm) float @ret_frem_same_operands_noqnan 380; CHECK-SAME: (float nofpclass(qnan) [[ARG:%.*]]) #[[ATTR0]] { 381; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG]], [[ARG]] 382; CHECK-NEXT: ret float [[FREM]] 383; 384 %frem = frem float %arg, %arg 385 ret float %frem 386} 387 388define float @ret_frem_same_operands_nonan(float nofpclass(nan) %arg) #0 { 389; CHECK-LABEL: define nofpclass(inf sub norm) float @ret_frem_same_operands_nonan 390; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR0]] { 391; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG]], [[ARG]] 392; CHECK-NEXT: ret float [[FREM]] 393; 394 %frem = frem float %arg, %arg 395 ret float %frem 396} 397 398define float @ret_frem_no_neg_lhs(float nofpclass(ninf nsub nnorm) %arg0, float %arg1) #0 { 399; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_frem_no_neg_lhs 400; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] { 401; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 402; CHECK-NEXT: ret float [[FREM]] 403; 404 %frem = frem float %arg0, %arg1 405 ret float %frem 406} 407 408define float @ret_frem_no_neg_rhs(float %arg0, float nofpclass(ninf nsub nnorm) %arg1) #0 { 409; CHECK-LABEL: define float @ret_frem_no_neg_rhs 410; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] { 411; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 412; CHECK-NEXT: ret float [[FREM]] 413; 414 %frem = frem float %arg0, %arg1 415 ret float %frem 416} 417 418define float @ret_frem_no_neg_nzero_rhs(float %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #0 { 419; CHECK-LABEL: define float @ret_frem_no_neg_nzero_rhs 420; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] { 421; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 422; CHECK-NEXT: ret float [[FREM]] 423; 424 %frem = frem float %arg0, %arg1 425 ret float %frem 426} 427 428define float @ret_frem_no_neg(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm) %arg1) #0 { 429; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_frem_no_neg 430; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] { 431; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 432; CHECK-NEXT: ret float [[FREM]] 433; 434 %frem = frem float %arg0, %arg1 435 ret float %frem 436} 437 438define float @ret_frem_no_neg_nzero(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #0 { 439; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_frem_no_neg_nzero 440; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] { 441; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 442; CHECK-NEXT: ret float [[FREM]] 443; 444 %frem = frem float %arg0, %arg1 445 ret float %frem 446} 447 448define float @ret_frem_no_neg_rhs_no_nzero(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #0 { 449; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_frem_no_neg_rhs_no_nzero 450; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] { 451; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 452; CHECK-NEXT: ret float [[FREM]] 453; 454 %frem = frem float %arg0, %arg1 455 ret float %frem 456} 457 458define float @ret_frem_no_neg_no_zero_rhs(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm zero) %arg1) #0 { 459; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_frem_no_neg_no_zero_rhs 460; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf zero nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] { 461; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 462; CHECK-NEXT: ret float [[FREM]] 463; 464 %frem = frem float %arg0, %arg1 465 ret float %frem 466} 467 468define float @ret_frem_no_pos_lhs(float nofpclass(pinf psub pnorm pzero) %arg0, float %arg1) #0 { 469; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_frem_no_pos_lhs 470; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] { 471; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 472; CHECK-NEXT: ret float [[FREM]] 473; 474 %frem = frem float %arg0, %arg1 475 ret float %frem 476} 477 478define float @ret_frem_no_pos_rhs(float %arg0, float nofpclass(pinf psub pnorm pzero) %arg1) #0 { 479; CHECK-LABEL: define float @ret_frem_no_pos_rhs 480; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(pinf pzero psub pnorm) [[ARG1:%.*]]) #[[ATTR0]] { 481; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 482; CHECK-NEXT: ret float [[FREM]] 483; 484 %frem = frem float %arg0, %arg1 485 ret float %frem 486} 487 488define float @ret_frem_no_pos_zero_lhs(float nofpclass(pinf psub pnorm) %arg0, float %arg1) #0 { 489; CHECK-LABEL: define nofpclass(pinf psub pnorm) float @ret_frem_no_pos_zero_lhs 490; CHECK-SAME: (float nofpclass(pinf psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] { 491; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 492; CHECK-NEXT: ret float [[FREM]] 493; 494 %frem = frem float %arg0, %arg1 495 ret float %frem 496} 497 498define float @ret_frem_no_pos_zero_rhs(float %arg0, float nofpclass(pinf psub pnorm) %arg1) #0 { 499; CHECK-LABEL: define float @ret_frem_no_pos_zero_rhs 500; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(pinf psub pnorm) [[ARG1:%.*]]) #[[ATTR0]] { 501; CHECK-NEXT: [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]] 502; CHECK-NEXT: ret float [[FREM]] 503; 504 %frem = frem float %arg0, %arg1 505 ret float %frem 506} 507 508attributes #0 = { "denormal-fp-math"="ieee,ieee" } 509attributes #1 = { "denormal-fp-math"="ieee,preserve-sign" } 510attributes #2 = { "denormal-fp-math"="ieee,positive-zero" } 511attributes #3 = { "denormal-fp-math"="ieee,dynamic" } 512;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 513; TUNIT: {{.*}} 514