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 @llvm.sqrt.f32(float) 5declare <2 x float> @llvm.sqrt.v2f32(<2 x float>) 6declare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata) 7 8define float @ret_sqrt(float %arg0) #0 { 9; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_sqrt 10; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR2:[0-9]+]] { 11; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nsub nnorm) float @llvm.sqrt.f32(float [[ARG0]]) #[[ATTR10:[0-9]+]] 12; CHECK-NEXT: ret float [[CALL]] 13; 14 %call = call float @llvm.sqrt.f32(float %arg0) 15 ret float %call 16} 17 18define float @ret_sqrt_noinf(float nofpclass(inf) %arg0) #0 { 19; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_noinf 20; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR2]] { 21; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf) [[ARG0]]) #[[ATTR10]] 22; CHECK-NEXT: ret float [[CALL]] 23; 24 %call = call float @llvm.sqrt.f32(float %arg0) 25 ret float %call 26} 27 28define float @ret_sqrt_nopinf(float nofpclass(pinf) %arg0) #0 { 29; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_nopinf 30; CHECK-SAME: (float nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR2]] { 31; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(pinf) [[ARG0]]) #[[ATTR10]] 32; CHECK-NEXT: ret float [[CALL]] 33; 34 %call = call float @llvm.sqrt.f32(float %arg0) 35 ret float %call 36} 37 38define float @ret_sqrt_noninf(float nofpclass(ninf) %arg0) #0 { 39; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_sqrt_noninf 40; CHECK-SAME: (float nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR2]] { 41; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(ninf) [[ARG0]]) #[[ATTR10]] 42; CHECK-NEXT: ret float [[CALL]] 43; 44 %call = call float @llvm.sqrt.f32(float %arg0) 45 ret float %call 46} 47 48define float @ret_sqrt_nonan(float nofpclass(nan) %arg0) #0 { 49; CHECK-LABEL: define nofpclass(snan ninf nsub nnorm) float @ret_sqrt_nonan 50; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR2]] { 51; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan ninf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(nan) [[ARG0]]) #[[ATTR10]] 52; CHECK-NEXT: ret float [[CALL]] 53; 54 %call = call float @llvm.sqrt.f32(float %arg0) 55 ret float %call 56} 57 58define float @ret_sqrt_nonan_noinf(float nofpclass(nan inf) %arg0) #0 { 59; CHECK-LABEL: define nofpclass(snan inf nsub nnorm) float @ret_sqrt_nonan_noinf 60; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]]) #[[ATTR2]] { 61; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf) [[ARG0]]) #[[ATTR10]] 62; CHECK-NEXT: ret float [[CALL]] 63; 64 %call = call float @llvm.sqrt.f32(float %arg0) 65 ret float %call 66} 67 68define float @ret_sqrt_nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0) #0 { 69; CHECK-LABEL: define nofpclass(snan inf nzero nsub nnorm) float @ret_sqrt_nonan_noinf_nozero 70; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]]) #[[ATTR2]] { 71; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR10]] 72; CHECK-NEXT: ret float [[CALL]] 73; 74 %call = call float @llvm.sqrt.f32(float %arg0) 75 ret float %call 76} 77 78define float @ret_sqrt_noinf_nozero(float nofpclass(inf zero) %arg0) #0 { 79; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_noinf_nozero 80; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR2]] { 81; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]] 82; CHECK-NEXT: ret float [[CALL]] 83; 84 %call = call float @llvm.sqrt.f32(float %arg0) 85 ret float %call 86} 87 88define float @ret_sqrt_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #0 { 89; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_noinf_nonegzero 90; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR2]] { 91; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]] 92; CHECK-NEXT: ret float [[CALL]] 93; 94 %call = call float @llvm.sqrt.f32(float %arg0) 95 ret float %call 96} 97 98define float @ret_sqrt_positive_source(i32 %arg) #0 { 99; CHECK-LABEL: define nofpclass(nan inf nzero nsub nnorm) float @ret_sqrt_positive_source 100; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR2]] { 101; CHECK-NEXT: [[UITOFP:%.*]] = uitofp i32 [[ARG]] to float 102; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan inf nzero nsub nnorm) float @llvm.sqrt.f32(float [[UITOFP]]) #[[ATTR10]] 103; CHECK-NEXT: ret float [[CALL]] 104; 105 %uitofp = uitofp i32 %arg to float 106 %call = call float @llvm.sqrt.f32(float %uitofp) 107 ret float %call 108} 109 110; Could produce a nan because we don't know if the multiply is negative. 111define float @ret_sqrt_unknown_sign(float nofpclass(nan) %arg0, float nofpclass(nan) %arg1) #0 { 112; CHECK-LABEL: define nofpclass(snan ninf nsub nnorm) float @ret_sqrt_unknown_sign 113; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR2]] { 114; CHECK-NEXT: [[UNKNOWN_SIGN_NOT_NAN:%.*]] = fmul nnan float [[ARG0]], [[ARG1]] 115; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan ninf nsub nnorm) float @llvm.sqrt.f32(float [[UNKNOWN_SIGN_NOT_NAN]]) #[[ATTR10]] 116; CHECK-NEXT: ret float [[CALL]] 117; 118 %unknown.sign.not.nan = fmul nnan float %arg0, %arg1 119 %call = call float @llvm.sqrt.f32(float %unknown.sign.not.nan) 120 ret float %call 121} 122 123define float @ret_sqrt_daz_noinf_nozero(float nofpclass(inf zero) %arg0) #1 { 124; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_daz_noinf_nozero 125; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR3:[0-9]+]] { 126; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]] 127; CHECK-NEXT: ret float [[CALL]] 128; 129 %call = call float @llvm.sqrt.f32(float %arg0) 130 ret float %call 131} 132 133define <2 x float> @ret_sqrt_daz_noinf_nozero_v2f32(<2 x float> nofpclass(inf zero) %arg0) #1 { 134; CHECK-LABEL: define nofpclass(inf nsub nnorm) <2 x float> @ret_sqrt_daz_noinf_nozero_v2f32 135; CHECK-SAME: (<2 x float> nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR3]] { 136; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nsub nnorm) <2 x float> @llvm.sqrt.v2f32(<2 x float> nofpclass(inf zero) [[ARG0]]) #[[ATTR10]] 137; CHECK-NEXT: ret <2 x float> [[CALL]] 138; 139 %call = call <2 x float> @llvm.sqrt.v2f32(<2 x float> %arg0) 140 ret <2 x float> %call 141} 142 143define float @ret_sqrt_daz_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #1 { 144; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_daz_noinf_nonegzero 145; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR3]] { 146; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]] 147; CHECK-NEXT: ret float [[CALL]] 148; 149 %call = call float @llvm.sqrt.f32(float %arg0) 150 ret float %call 151} 152 153define float @ret_sqrt_dapz_noinf_nozero(float nofpclass(inf zero) %arg0) #2 { 154; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_dapz_noinf_nozero 155; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR4:[0-9]+]] { 156; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]] 157; CHECK-NEXT: ret float [[CALL]] 158; 159 %call = call float @llvm.sqrt.f32(float %arg0) 160 ret float %call 161} 162 163define float @ret_sqrt_dapz_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #2 { 164; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_dapz_noinf_nonegzero 165; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR4]] { 166; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]] 167; CHECK-NEXT: ret float [[CALL]] 168; 169 %call = call float @llvm.sqrt.f32(float %arg0) 170 ret float %call 171} 172 173define float @ret_sqrt_dynamic_noinf_nozero(float nofpclass(inf zero) %arg0) #3 { 174; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_dynamic_noinf_nozero 175; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR5:[0-9]+]] { 176; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]] 177; CHECK-NEXT: ret float [[CALL]] 178; 179 %call = call float @llvm.sqrt.f32(float %arg0) 180 ret float %call 181} 182 183define float @ret_sqrt_dynamic_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #3 { 184; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_dynamic_noinf_nonegzero 185; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR5]] { 186; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]] 187; CHECK-NEXT: ret float [[CALL]] 188; 189 %call = call float @llvm.sqrt.f32(float %arg0) 190 ret float %call 191} 192 193define float @ret_sqrt_ftz_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #4 { 194; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_ftz_noinf_nonegzero 195; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR6:[0-9]+]] { 196; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]] 197; CHECK-NEXT: ret float [[CALL]] 198; 199 %call = call float @llvm.sqrt.f32(float %arg0) 200 ret float %call 201} 202 203define float @ret_sqrt_ftpz_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #5 { 204; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_ftpz_noinf_nonegzero 205; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR7:[0-9]+]] { 206; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]] 207; CHECK-NEXT: ret float [[CALL]] 208; 209 %call = call float @llvm.sqrt.f32(float %arg0) 210 ret float %call 211} 212 213define float @ret_sqrt_ftz_dynamic_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #6 { 214; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_ftz_dynamic_noinf_nonegzero 215; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR8:[0-9]+]] { 216; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]] 217; CHECK-NEXT: ret float [[CALL]] 218; 219 %call = call float @llvm.sqrt.f32(float %arg0) 220 ret float %call 221} 222 223define float @constrained_sqrt(float %arg) strictfp { 224; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @constrained_sqrt 225; CHECK-SAME: (float [[ARG:%.*]]) #[[ATTR9:[0-9]+]] { 226; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(ninf nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11:[0-9]+]] 227; CHECK-NEXT: ret float [[VAL]] 228; 229 %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict") 230 ret float %val 231} 232 233define float @constrained_sqrt_nonan(float nofpclass(nan) %arg) strictfp { 234; CHECK-LABEL: define nofpclass(snan ninf nsub nnorm) float @constrained_sqrt_nonan 235; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR9]] { 236; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(snan ninf nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(nan) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]] 237; CHECK-NEXT: ret float [[VAL]] 238; 239 %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict") 240 ret float %val 241} 242 243define float @constrained_sqrt_nopinf(float nofpclass(pinf) %arg) strictfp { 244; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @constrained_sqrt_nopinf 245; CHECK-SAME: (float nofpclass(pinf) [[ARG:%.*]]) #[[ATTR9]] { 246; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(pinf) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]] 247; CHECK-NEXT: ret float [[VAL]] 248; 249 %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict") 250 ret float %val 251} 252 253define float @constrained_sqrt_nonegzero(float nofpclass(nzero) %arg) strictfp { 254; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @constrained_sqrt_nonegzero 255; CHECK-SAME: (float nofpclass(nzero) [[ARG:%.*]]) #[[ATTR9]] { 256; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(nzero) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]] 257; CHECK-NEXT: ret float [[VAL]] 258; 259 %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict") 260 ret float %val 261} 262 263define float @constrained_sqrt_nozero(float nofpclass(zero) %arg) strictfp { 264; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @constrained_sqrt_nozero 265; CHECK-SAME: (float nofpclass(zero) [[ARG:%.*]]) #[[ATTR9]] { 266; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(zero) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]] 267; CHECK-NEXT: ret float [[VAL]] 268; 269 %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict") 270 ret float %val 271} 272 273attributes #0 = { "denormal-fp-math"="ieee,ieee" } 274attributes #1 = { "denormal-fp-math"="ieee,preserve-sign" } 275attributes #2 = { "denormal-fp-math"="ieee,positive-zero" } 276attributes #3 = { "denormal-fp-math"="ieee,dynamic" } 277attributes #4 = { "denormal-fp-math"="preserve-sign,ieee" } 278attributes #5 = { "denormal-fp-math"="positive-zero,ieee" } 279attributes #6 = { "denormal-fp-math"="dynamic,ieee" } 280 281;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 282; TUNIT: {{.*}} 283