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 4declare { float, i32 } @llvm.frexp.f32.i32(float) 5declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) 6declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>) 7 8define { float, i32 } @ret_frexp_f32(float %arg0) { 9; CHECK-LABEL: define { float, i32 } @ret_frexp_f32 10; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR1:[0-9]+]] { 11; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0]]) #[[ATTR7:[0-9]+]] 12; CHECK-NEXT: ret { float, i32 } [[CALL]] 13; 14 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 15 ret { float, i32 } %call 16} 17 18define { float, i32 } @ret_frexp_f32_nonan(float nofpclass(nan) %arg0) { 19; CHECK-LABEL: define { float, i32 } @ret_frexp_f32_nonan 20; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] { 21; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan) [[ARG0]]) #[[ATTR7]] 22; CHECK-NEXT: ret { float, i32 } [[CALL]] 23; 24 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 25 ret { float, i32 } %call 26} 27 28define float @ret_frexp_f32_0_nonan(float nofpclass(nan) %arg0) { 29; CHECK-LABEL: define nofpclass(nan sub) float @ret_frexp_f32_0_nonan 30; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] { 31; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan) [[ARG0]]) #[[ATTR7]] 32; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 33; CHECK-NEXT: ret float [[CALL_0]] 34; 35 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 36 %call.0 = extractvalue { float, i32 } %call, 0 37 ret float %call.0 38} 39 40define float @ret_frexp_f32_0_nosnan(float nofpclass(snan) %arg0) { 41; CHECK-LABEL: define nofpclass(snan sub) float @ret_frexp_f32_0_nosnan 42; CHECK-SAME: (float nofpclass(snan) [[ARG0:%.*]]) #[[ATTR1]] { 43; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(snan) [[ARG0]]) #[[ATTR7]] 44; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 45; CHECK-NEXT: ret float [[CALL_0]] 46; 47 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 48 %call.0 = extractvalue { float, i32 } %call, 0 49 ret float %call.0 50} 51 52define float @ret_frexp_f32_0_noqnan(float nofpclass(qnan) %arg0) { 53; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_noqnan 54; CHECK-SAME: (float nofpclass(qnan) [[ARG0:%.*]]) #[[ATTR1]] { 55; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(qnan) [[ARG0]]) #[[ATTR7]] 56; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 57; CHECK-NEXT: ret float [[CALL_0]] 58; 59 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 60 %call.0 = extractvalue { float, i32 } %call, 0 61 ret float %call.0 62} 63 64define i32 @ret_frexp_f32_1_nonan(float nofpclass(nan) %arg0) { 65; CHECK-LABEL: define i32 @ret_frexp_f32_1_nonan 66; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] { 67; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan) [[ARG0]]) #[[ATTR7]] 68; CHECK-NEXT: [[CALL_1:%.*]] = extractvalue { float, i32 } [[CALL]], 1 69; CHECK-NEXT: ret i32 [[CALL_1]] 70; 71 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 72 %call.1 = extractvalue { float, i32 } %call, 1 73 ret i32 %call.1 74} 75 76define <2 x float> @ret_frexp_v2f32_0_nonan(<2 x float> nofpclass(nan) %arg0) { 77; CHECK-LABEL: define nofpclass(nan sub) <2 x float> @ret_frexp_v2f32_0_nonan 78; CHECK-SAME: (<2 x float> nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] { 79; CHECK-NEXT: [[CALL:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> nofpclass(nan) [[ARG0]]) #[[ATTR7]] 80; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { <2 x float>, <2 x i32> } [[CALL]], 0 81; CHECK-NEXT: ret <2 x float> [[CALL_0]] 82; 83 %call = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %arg0) 84 %call.0 = extractvalue { <2 x float>, <2 x i32> } %call, 0 85 ret <2 x float> %call.0 86} 87 88define <2 x i32> @ret_frexp_v2f32_1_nonan(<2 x float> nofpclass(nan) %arg0) { 89; CHECK-LABEL: define <2 x i32> @ret_frexp_v2f32_1_nonan 90; CHECK-SAME: (<2 x float> nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] { 91; CHECK-NEXT: [[CALL:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> nofpclass(nan) [[ARG0]]) #[[ATTR7]] 92; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { <2 x float>, <2 x i32> } [[CALL]], 1 93; CHECK-NEXT: ret <2 x i32> [[CALL_0]] 94; 95 %call = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %arg0) 96 %call.0 = extractvalue { <2 x float>, <2 x i32> } %call, 1 97 ret <2 x i32> %call.0 98} 99 100define float @ret_frexp_v4f32_0_nonan_elt1(<4 x float> nofpclass(nan) %arg0) { 101; CHECK-LABEL: define nofpclass(nan sub) float @ret_frexp_v4f32_0_nonan_elt1 102; CHECK-SAME: (<4 x float> nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] { 103; CHECK-NEXT: [[CALL:%.*]] = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> nofpclass(nan) [[ARG0]]) #[[ATTR7]] 104; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { <4 x float>, <4 x i32> } [[CALL]], 0 105; CHECK-NEXT: [[ELT_2:%.*]] = extractelement <4 x float> [[CALL_0]], i32 2 106; CHECK-NEXT: ret float [[ELT_2]] 107; 108 %call = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %arg0) 109 %call.0 = extractvalue { <4 x float>, <4 x i32> } %call, 0 110 %elt.2 = extractelement <4 x float> %call.0, i32 2 111 ret float %elt.2 112} 113 114define float @ret_frexp_f32_0_nopos_nopzero(float nofpclass(pinf psub pnorm pzero) %arg0) { 115; CHECK-LABEL: define nofpclass(pinf pzero sub pnorm) float @ret_frexp_f32_0_nopos_nopzero 116; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] { 117; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pinf pzero psub pnorm) [[ARG0]]) #[[ATTR7]] 118; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 119; CHECK-NEXT: ret float [[CALL_0]] 120; 121 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 122 %call.0 = extractvalue { float, i32 } %call, 0 123 ret float %call.0 124} 125 126define float @ret_frexp_f32_0_nopos_nopzero_nonan(float nofpclass(pinf psub pnorm pzero nan) %arg0) { 127; CHECK-LABEL: define nofpclass(nan pinf pzero sub pnorm) float @ret_frexp_f32_0_nopos_nopzero_nonan 128; CHECK-SAME: (float nofpclass(nan pinf pzero psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] { 129; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan pinf pzero psub pnorm) [[ARG0]]) #[[ATTR7]] 130; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 131; CHECK-NEXT: ret float [[CALL_0]] 132; 133 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 134 %call.0 = extractvalue { float, i32 } %call, 0 135 ret float %call.0 136} 137 138define float @ret_frexp_f32_0_nopos(float nofpclass(pinf psub pnorm) %arg0) { 139; CHECK-LABEL: define nofpclass(pinf sub) float @ret_frexp_f32_0_nopos 140; CHECK-SAME: (float nofpclass(pinf psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] { 141; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pinf psub pnorm) [[ARG0]]) #[[ATTR7]] 142; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 143; CHECK-NEXT: ret float [[CALL_0]] 144; 145 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 146 %call.0 = extractvalue { float, i32 } %call, 0 147 ret float %call.0 148} 149 150define float @ret_frexp_f32_0_nopos_nonan(float nofpclass(pinf psub pnorm nan) %arg0) { 151; CHECK-LABEL: define nofpclass(nan pinf sub) float @ret_frexp_f32_0_nopos_nonan 152; CHECK-SAME: (float nofpclass(nan pinf psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] { 153; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan pinf psub pnorm) [[ARG0]]) #[[ATTR7]] 154; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 155; CHECK-NEXT: ret float [[CALL_0]] 156; 157 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 158 %call.0 = extractvalue { float, i32 } %call, 0 159 ret float %call.0 160} 161 162define float @ret_frexp_f32_0_nopos_nozero(float nofpclass(pinf psub pnorm zero) %arg0) { 163; CHECK-LABEL: define nofpclass(pinf zero sub pnorm) float @ret_frexp_f32_0_nopos_nozero 164; CHECK-SAME: (float nofpclass(pinf zero psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] { 165; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pinf zero psub pnorm) [[ARG0]]) #[[ATTR7]] 166; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 167; CHECK-NEXT: ret float [[CALL_0]] 168; 169 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 170 %call.0 = extractvalue { float, i32 } %call, 0 171 ret float %call.0 172} 173 174define float @ret_frexp_f32_0_noneg_nonzero(float nofpclass(ninf nsub nnorm nzero) %arg0) { 175; CHECK-LABEL: define nofpclass(ninf nzero sub nnorm) float @ret_frexp_f32_0_noneg_nonzero 176; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] { 177; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(ninf nzero nsub nnorm) [[ARG0]]) #[[ATTR7]] 178; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 179; CHECK-NEXT: ret float [[CALL_0]] 180; 181 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 182 %call.0 = extractvalue { float, i32 } %call, 0 183 ret float %call.0 184} 185 186define float @ret_frexp_f32_0_noneg_nonzero_nonan(float nofpclass(ninf nsub nnorm nzero nan) %arg0) { 187; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) float @ret_frexp_f32_0_noneg_nonzero_nonan 188; CHECK-SAME: (float nofpclass(nan ninf nzero nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] { 189; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan ninf nzero nsub nnorm) [[ARG0]]) #[[ATTR7]] 190; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 191; CHECK-NEXT: ret float [[CALL_0]] 192; 193 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 194 %call.0 = extractvalue { float, i32 } %call, 0 195 ret float %call.0 196} 197 198define float @ret_frexp_f32_0_noneg(float nofpclass(ninf nsub nnorm) %arg0) { 199; CHECK-LABEL: define nofpclass(ninf sub) float @ret_frexp_f32_0_noneg 200; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] { 201; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(ninf nsub nnorm) [[ARG0]]) #[[ATTR7]] 202; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 203; CHECK-NEXT: ret float [[CALL_0]] 204; 205 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 206 %call.0 = extractvalue { float, i32 } %call, 0 207 ret float %call.0 208} 209 210define float @ret_frexp_f32_0_noneg_nonan(float nofpclass(ninf nsub nnorm nan) %arg0) { 211; CHECK-LABEL: define nofpclass(nan ninf sub) float @ret_frexp_f32_0_noneg_nonan 212; CHECK-SAME: (float nofpclass(nan ninf nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] { 213; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan ninf nsub nnorm) [[ARG0]]) #[[ATTR7]] 214; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 215; CHECK-NEXT: ret float [[CALL_0]] 216; 217 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 218 %call.0 = extractvalue { float, i32 } %call, 0 219 ret float %call.0 220} 221 222define float @ret_frexp_f32_0_noneg_nozero(float nofpclass(ninf nsub nnorm nzero) %arg0) { 223; CHECK-LABEL: define nofpclass(ninf nzero sub nnorm) float @ret_frexp_f32_0_noneg_nozero 224; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] { 225; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(ninf nzero nsub nnorm) [[ARG0]]) #[[ATTR7]] 226; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 227; CHECK-NEXT: ret float [[CALL_0]] 228; 229 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 230 %call.0 = extractvalue { float, i32 } %call, 0 231 ret float %call.0 232} 233 234define float @ret_frexp_f32_0_nopzero(float nofpclass(pzero) %arg0) { 235; CHECK-LABEL: define nofpclass(pzero sub) float @ret_frexp_f32_0_nopzero 236; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR1]] { 237; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]] 238; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 239; CHECK-NEXT: ret float [[CALL_0]] 240; 241 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 242 %call.0 = extractvalue { float, i32 } %call, 0 243 ret float %call.0 244} 245 246define float @ret_frexp_f32_0_nonzero(float nofpclass(nzero) %arg0) { 247; CHECK-LABEL: define nofpclass(nzero sub) float @ret_frexp_f32_0_nonzero 248; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR1]] { 249; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]] 250; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 251; CHECK-NEXT: ret float [[CALL_0]] 252; 253 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 254 %call.0 = extractvalue { float, i32 } %call, 0 255 ret float %call.0 256} 257 258define float @ret_frexp_f32_0_nozero(float nofpclass(zero) %arg0) { 259; CHECK-LABEL: define nofpclass(zero sub) float @ret_frexp_f32_0_nozero 260; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]]) #[[ATTR1]] { 261; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(zero) [[ARG0]]) #[[ATTR7]] 262; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 263; CHECK-NEXT: ret float [[CALL_0]] 264; 265 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 266 %call.0 = extractvalue { float, i32 } %call, 0 267 ret float %call.0 268} 269 270define float @ret_frexp_f32_0_nopinf(float nofpclass(pinf) %arg0) { 271; CHECK-LABEL: define nofpclass(pinf sub) float @ret_frexp_f32_0_nopinf 272; CHECK-SAME: (float nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR1]] { 273; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pinf) [[ARG0]]) #[[ATTR7]] 274; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 275; CHECK-NEXT: ret float [[CALL_0]] 276; 277 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 278 %call.0 = extractvalue { float, i32 } %call, 0 279 ret float %call.0 280} 281 282define float @ret_frexp_f32_0_noninf(float nofpclass(ninf) %arg0) { 283; CHECK-LABEL: define nofpclass(ninf sub) float @ret_frexp_f32_0_noninf 284; CHECK-SAME: (float nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR1]] { 285; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(ninf) [[ARG0]]) #[[ATTR7]] 286; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 287; CHECK-NEXT: ret float [[CALL_0]] 288; 289 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 290 %call.0 = extractvalue { float, i32 } %call, 0 291 ret float %call.0 292} 293 294define float @ret_frexp_f32_0_noinf(float nofpclass(inf) %arg0) { 295; CHECK-LABEL: define nofpclass(inf sub) float @ret_frexp_f32_0_noinf 296; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR1]] { 297; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(inf) [[ARG0]]) #[[ATTR7]] 298; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 299; CHECK-NEXT: ret float [[CALL_0]] 300; 301 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 302 %call.0 = extractvalue { float, i32 } %call, 0 303 ret float %call.0 304} 305 306define float @ret_frexp_f32_0_nozero_nonan(float nofpclass(zero nan) %arg0) { 307; CHECK-LABEL: define nofpclass(nan zero sub) float @ret_frexp_f32_0_nozero_nonan 308; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]]) #[[ATTR1]] { 309; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan zero) [[ARG0]]) #[[ATTR7]] 310; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 311; CHECK-NEXT: ret float [[CALL_0]] 312; 313 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 314 %call.0 = extractvalue { float, i32 } %call, 0 315 ret float %call.0 316} 317 318define float @ret_frexp_f32_0_nozero_noinf(float nofpclass(zero inf) %arg0) { 319; CHECK-LABEL: define nofpclass(inf zero sub) float @ret_frexp_f32_0_nozero_noinf 320; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR1]] { 321; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR7]] 322; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 323; CHECK-NEXT: ret float [[CALL_0]] 324; 325 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 326 %call.0 = extractvalue { float, i32 } %call, 0 327 ret float %call.0 328} 329 330define float @ret_frexp_f32_0_nozero_nonan_noinf(float nofpclass(zero nan inf) %arg0) { 331; CHECK-LABEL: define nofpclass(nan inf zero sub) float @ret_frexp_f32_0_nozero_nonan_noinf 332; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]]) #[[ATTR1]] { 333; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR7]] 334; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 335; CHECK-NEXT: ret float [[CALL_0]] 336; 337 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 338 %call.0 = extractvalue { float, i32 } %call, 0 339 ret float %call.0 340} 341 342define float @ret_frexp_f32_0_nonzero_ftz_daz(float nofpclass(nzero) %arg0) #1 { 343; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nonzero_ftz_daz 344; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR2:[0-9]+]] { 345; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]] 346; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 347; CHECK-NEXT: ret float [[CALL_0]] 348; 349 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 350 %call.0 = extractvalue { float, i32 } %call, 0 351 ret float %call.0 352} 353 354define float @ret_frexp_f32_0_nonzero_ftpz_dapz(float nofpclass(nzero) %arg0) #2 { 355; CHECK-LABEL: define nofpclass(nzero sub) float @ret_frexp_f32_0_nonzero_ftpz_dapz 356; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR3:[0-9]+]] { 357; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]] 358; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 359; CHECK-NEXT: ret float [[CALL_0]] 360; 361 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 362 %call.0 = extractvalue { float, i32 } %call, 0 363 ret float %call.0 364} 365 366define float @ret_frexp_f32_0_nonzero_dynamic_dynamic(float nofpclass(nzero) %arg0) #3 { 367; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nonzero_dynamic_dynamic 368; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR4:[0-9]+]] { 369; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]] 370; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 371; CHECK-NEXT: ret float [[CALL_0]] 372; 373 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 374 %call.0 = extractvalue { float, i32 } %call, 0 375 ret float %call.0 376} 377 378define float @ret_frexp_f32_0_nonzero_ieee_daz(float nofpclass(nzero) %arg0) #4 { 379; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nonzero_ieee_daz 380; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR5:[0-9]+]] { 381; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]] 382; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 383; CHECK-NEXT: ret float [[CALL_0]] 384; 385 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 386 %call.0 = extractvalue { float, i32 } %call, 0 387 ret float %call.0 388} 389 390define float @ret_frexp_f32_0_nonzero_daz_ieee(float nofpclass(nzero) %arg0) #5 { 391; CHECK-LABEL: define nofpclass(nzero sub) float @ret_frexp_f32_0_nonzero_daz_ieee 392; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR6:[0-9]+]] { 393; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]] 394; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 395; CHECK-NEXT: ret float [[CALL_0]] 396; 397 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 398 %call.0 = extractvalue { float, i32 } %call, 0 399 ret float %call.0 400} 401 402define float @ret_frexp_f32_0_nopzero_ftz_daz(float nofpclass(pzero) %arg0) #1 { 403; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nopzero_ftz_daz 404; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR2]] { 405; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]] 406; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 407; CHECK-NEXT: ret float [[CALL_0]] 408; 409 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 410 %call.0 = extractvalue { float, i32 } %call, 0 411 ret float %call.0 412} 413 414define float @ret_frexp_f32_0_nopzero_ftpz_dapz(float nofpclass(pzero) %arg0) #2 { 415; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nopzero_ftpz_dapz 416; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR3]] { 417; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]] 418; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 419; CHECK-NEXT: ret float [[CALL_0]] 420; 421 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 422 %call.0 = extractvalue { float, i32 } %call, 0 423 ret float %call.0 424} 425 426define float @ret_frexp_f32_0_nopzero_dynamic_dynamic(float nofpclass(pzero) %arg0) #3 { 427; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nopzero_dynamic_dynamic 428; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR4]] { 429; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]] 430; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 431; CHECK-NEXT: ret float [[CALL_0]] 432; 433 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 434 %call.0 = extractvalue { float, i32 } %call, 0 435 ret float %call.0 436} 437 438define float @ret_frexp_f32_0_nopzero_ieee_daz(float nofpclass(pzero) %arg0) #4 { 439; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nopzero_ieee_daz 440; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR5]] { 441; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]] 442; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 443; CHECK-NEXT: ret float [[CALL_0]] 444; 445 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 446 %call.0 = extractvalue { float, i32 } %call, 0 447 ret float %call.0 448} 449 450define float @ret_frexp_f32_0_nopzero_daz_ieee(float nofpclass(pzero) %arg0) #5 { 451; CHECK-LABEL: define nofpclass(pzero sub) float @ret_frexp_f32_0_nopzero_daz_ieee 452; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR6]] { 453; CHECK-NEXT: [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]] 454; CHECK-NEXT: [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0 455; CHECK-NEXT: ret float [[CALL_0]] 456; 457 %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0) 458 %call.0 = extractvalue { float, i32 } %call, 0 459 ret float %call.0 460} 461 462 463attributes #0 = { "denormal-fp-math"="ieee,ieee" } 464attributes #1 = { "denormal-fp-math"="preserve-sign,preserve-sign" } 465attributes #2 = { "denormal-fp-math"="positive-zero,positive-zero" } 466attributes #3 = { "denormal-fp-math"="dynamic,dynamic" } 467attributes #4 = { "denormal-fp-math"="ieee,preserve-sign" } 468attributes #5 = { "denormal-fp-math"="preserve-sign,ieee" } 469 470 471;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 472; TUNIT: {{.*}} 473