354 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT3 4declare float @llvm.exp.f32(float)5declare float @llvm.exp2.f32(float)6declare float @llvm.exp10.f32(float)7 8define float @ret_exp(float %arg0) {9; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp10; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR1:[0-9]+]] {11; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp.f32(float [[ARG0]]) #[[ATTR2:[0-9]+]]12; CHECK-NEXT: ret float [[CALL]]13;14 %call = call float @llvm.exp.f32(float %arg0)15 ret float %call16}17 18define float @ret_exp_noinf(float nofpclass(inf) %arg0) {19; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp_noinf20; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR1]] {21; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp.f32(float nofpclass(inf) [[ARG0]]) #[[ATTR2]]22; CHECK-NEXT: ret float [[CALL]]23;24 %call = call float @llvm.exp.f32(float %arg0)25 ret float %call26}27 28define float @ret_exp_nopinf(float nofpclass(pinf) %arg0) {29; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp_nopinf30; CHECK-SAME: (float nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR1]] {31; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp.f32(float nofpclass(pinf) [[ARG0]]) #[[ATTR2]]32; CHECK-NEXT: ret float [[CALL]]33;34 %call = call float @llvm.exp.f32(float %arg0)35 ret float %call36}37 38define float @ret_exp_noninf(float nofpclass(ninf) %arg0) {39; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp_noninf40; CHECK-SAME: (float nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR1]] {41; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp.f32(float nofpclass(ninf) [[ARG0]]) #[[ATTR2]]42; CHECK-NEXT: ret float [[CALL]]43;44 %call = call float @llvm.exp.f32(float %arg0)45 ret float %call46}47 48define float @ret_exp_nonan(float nofpclass(nan) %arg0) {49; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp_nonan50; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {51; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp.f32(float nofpclass(nan) [[ARG0]]) #[[ATTR2]]52; CHECK-NEXT: ret float [[CALL]]53;54 %call = call float @llvm.exp.f32(float %arg0)55 ret float %call56}57 58define float @ret_exp_nonan_noinf(float nofpclass(nan inf) %arg0) {59; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp_nonan_noinf60; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]]) #[[ATTR1]] {61; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp.f32(float nofpclass(nan inf) [[ARG0]]) #[[ATTR2]]62; CHECK-NEXT: ret float [[CALL]]63;64 %call = call float @llvm.exp.f32(float %arg0)65 ret float %call66}67 68define float @ret_exp_nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0) {69; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp_nonan_noinf_nozero70; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]]) #[[ATTR1]] {71; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp.f32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR2]]72; CHECK-NEXT: ret float [[CALL]]73;74 %call = call float @llvm.exp.f32(float %arg0)75 ret float %call76}77 78define float @ret_exp_noinf_nozero(float nofpclass(inf zero) %arg0) {79; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp_noinf_nozero80; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR1]] {81; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR2]]82; CHECK-NEXT: ret float [[CALL]]83;84 %call = call float @llvm.exp.f32(float %arg0)85 ret float %call86}87 88define float @ret_exp_noinf_nonegzero(float nofpclass(inf nzero) %arg0) {89; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp_noinf_nonegzero90; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR1]] {91; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR2]]92; CHECK-NEXT: ret float [[CALL]]93;94 %call = call float @llvm.exp.f32(float %arg0)95 ret float %call96}97 98define float @ret_exp_positive_source(i32 %arg) {99; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp_positive_source100; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR1]] {101; CHECK-NEXT: [[UITOFP:%.*]] = uitofp i32 [[ARG]] to float102; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp.f32(float [[UITOFP]]) #[[ATTR2]]103; CHECK-NEXT: ret float [[CALL]]104;105 %uitofp = uitofp i32 %arg to float106 %call = call float @llvm.exp.f32(float %uitofp)107 ret float %call108}109 110; Could produce a nan because we don't know if the multiply is negative.111define float @ret_exp_unknown_sign(float nofpclass(nan) %arg0, float nofpclass(nan) %arg1) {112; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp_unknown_sign113; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR1]] {114; CHECK-NEXT: [[UNKNOWN_SIGN_NOT_NAN:%.*]] = fmul nnan float [[ARG0]], [[ARG1]]115; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp.f32(float [[UNKNOWN_SIGN_NOT_NAN]]) #[[ATTR2]]116; CHECK-NEXT: ret float [[CALL]]117;118 %unknown.sign.not.nan = fmul nnan float %arg0, %arg1119 %call = call float @llvm.exp.f32(float %unknown.sign.not.nan)120 ret float %call121}122 123define float @ret_exp2(float %arg0) {124; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp2125; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR1]] {126; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp2.f32(float [[ARG0]]) #[[ATTR2]]127; CHECK-NEXT: ret float [[CALL]]128;129 %call = call float @llvm.exp2.f32(float %arg0)130 ret float %call131}132 133define float @ret_exp2_noinf(float nofpclass(inf) %arg0) {134; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp2_noinf135; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR1]] {136; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp2.f32(float nofpclass(inf) [[ARG0]]) #[[ATTR2]]137; CHECK-NEXT: ret float [[CALL]]138;139 %call = call float @llvm.exp2.f32(float %arg0)140 ret float %call141}142 143define float @ret_exp2_nopinf(float nofpclass(pinf) %arg0) {144; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp2_nopinf145; CHECK-SAME: (float nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR1]] {146; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp2.f32(float nofpclass(pinf) [[ARG0]]) #[[ATTR2]]147; CHECK-NEXT: ret float [[CALL]]148;149 %call = call float @llvm.exp2.f32(float %arg0)150 ret float %call151}152 153define float @ret_exp2_noninf(float nofpclass(ninf) %arg0) {154; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp2_noninf155; CHECK-SAME: (float nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR1]] {156; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp2.f32(float nofpclass(ninf) [[ARG0]]) #[[ATTR2]]157; CHECK-NEXT: ret float [[CALL]]158;159 %call = call float @llvm.exp2.f32(float %arg0)160 ret float %call161}162 163define float @ret_exp2_nonan(float nofpclass(nan) %arg0) {164; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp2_nonan165; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {166; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp2.f32(float nofpclass(nan) [[ARG0]]) #[[ATTR2]]167; CHECK-NEXT: ret float [[CALL]]168;169 %call = call float @llvm.exp2.f32(float %arg0)170 ret float %call171}172 173define float @ret_exp2_nonan_noinf(float nofpclass(nan inf) %arg0) {174; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp2_nonan_noinf175; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]]) #[[ATTR1]] {176; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp2.f32(float nofpclass(nan inf) [[ARG0]]) #[[ATTR2]]177; CHECK-NEXT: ret float [[CALL]]178;179 %call = call float @llvm.exp2.f32(float %arg0)180 ret float %call181}182 183define float @ret_exp2_nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0) {184; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp2_nonan_noinf_nozero185; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]]) #[[ATTR1]] {186; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp2.f32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR2]]187; CHECK-NEXT: ret float [[CALL]]188;189 %call = call float @llvm.exp2.f32(float %arg0)190 ret float %call191}192 193define float @ret_exp2_noinf_nozero(float nofpclass(inf zero) %arg0) {194; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp2_noinf_nozero195; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR1]] {196; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp2.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR2]]197; CHECK-NEXT: ret float [[CALL]]198;199 %call = call float @llvm.exp2.f32(float %arg0)200 ret float %call201}202 203define float @ret_exp2_noinf_nonegzero(float nofpclass(inf nzero) %arg0) {204; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp2_noinf_nonegzero205; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR1]] {206; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp2.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR2]]207; CHECK-NEXT: ret float [[CALL]]208;209 %call = call float @llvm.exp2.f32(float %arg0)210 ret float %call211}212 213define float @ret_exp2_positive_source(i32 %arg) {214; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp2_positive_source215; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR1]] {216; CHECK-NEXT: [[UITOFP:%.*]] = uitofp i32 [[ARG]] to float217; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp2.f32(float [[UITOFP]]) #[[ATTR2]]218; CHECK-NEXT: ret float [[CALL]]219;220 %uitofp = uitofp i32 %arg to float221 %call = call float @llvm.exp2.f32(float %uitofp)222 ret float %call223}224 225; Could produce a nan because we don't know if the multiply is negative.226define float @ret_exp2_unknown_sign(float nofpclass(nan) %arg0, float nofpclass(nan) %arg1) {227; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp2_unknown_sign228; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR1]] {229; CHECK-NEXT: [[UNKNOWN_SIGN_NOT_NAN:%.*]] = fmul nnan float [[ARG0]], [[ARG1]]230; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp2.f32(float [[UNKNOWN_SIGN_NOT_NAN]]) #[[ATTR2]]231; CHECK-NEXT: ret float [[CALL]]232;233 %unknown.sign.not.nan = fmul nnan float %arg0, %arg1234 %call = call float @llvm.exp2.f32(float %unknown.sign.not.nan)235 ret float %call236}237 238define float @ret_exp10(float %arg0) {239; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp10240; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR1]] {241; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp10.f32(float [[ARG0]]) #[[ATTR2]]242; CHECK-NEXT: ret float [[CALL]]243;244 %call = call float @llvm.exp10.f32(float %arg0)245 ret float %call246}247 248define float @ret_exp10_noinf(float nofpclass(inf) %arg0) {249; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp10_noinf250; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR1]] {251; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp10.f32(float nofpclass(inf) [[ARG0]]) #[[ATTR2]]252; CHECK-NEXT: ret float [[CALL]]253;254 %call = call float @llvm.exp10.f32(float %arg0)255 ret float %call256}257 258define float @ret_exp10_nopinf(float nofpclass(pinf) %arg0) {259; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp10_nopinf260; CHECK-SAME: (float nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR1]] {261; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp10.f32(float nofpclass(pinf) [[ARG0]]) #[[ATTR2]]262; CHECK-NEXT: ret float [[CALL]]263;264 %call = call float @llvm.exp10.f32(float %arg0)265 ret float %call266}267 268define float @ret_exp10_noninf(float nofpclass(ninf) %arg0) {269; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp10_noninf270; CHECK-SAME: (float nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR1]] {271; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp10.f32(float nofpclass(ninf) [[ARG0]]) #[[ATTR2]]272; CHECK-NEXT: ret float [[CALL]]273;274 %call = call float @llvm.exp10.f32(float %arg0)275 ret float %call276}277 278define float @ret_exp10_nonan(float nofpclass(nan) %arg0) {279; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp10_nonan280; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {281; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp10.f32(float nofpclass(nan) [[ARG0]]) #[[ATTR2]]282; CHECK-NEXT: ret float [[CALL]]283;284 %call = call float @llvm.exp10.f32(float %arg0)285 ret float %call286}287 288define float @ret_exp10_nonan_noinf(float nofpclass(nan inf) %arg0) {289; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp10_nonan_noinf290; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]]) #[[ATTR1]] {291; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp10.f32(float nofpclass(nan inf) [[ARG0]]) #[[ATTR2]]292; CHECK-NEXT: ret float [[CALL]]293;294 %call = call float @llvm.exp10.f32(float %arg0)295 ret float %call296}297 298define float @ret_exp10_nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0) {299; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp10_nonan_noinf_nozero300; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]]) #[[ATTR1]] {301; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp10.f32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR2]]302; CHECK-NEXT: ret float [[CALL]]303;304 %call = call float @llvm.exp10.f32(float %arg0)305 ret float %call306}307 308define float @ret_exp10_noinf_nozero(float nofpclass(inf zero) %arg0) {309; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp10_noinf_nozero310; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR1]] {311; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp10.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR2]]312; CHECK-NEXT: ret float [[CALL]]313;314 %call = call float @llvm.exp10.f32(float %arg0)315 ret float %call316}317 318define float @ret_exp10_noinf_nonegzero(float nofpclass(inf nzero) %arg0) {319; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_exp10_noinf_nonegzero320; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR1]] {321; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.exp10.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR2]]322; CHECK-NEXT: ret float [[CALL]]323;324 %call = call float @llvm.exp10.f32(float %arg0)325 ret float %call326}327 328define float @ret_exp10_positive_source(i32 %arg) {329; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp10_positive_source330; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR1]] {331; CHECK-NEXT: [[UITOFP:%.*]] = uitofp i32 [[ARG]] to float332; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp10.f32(float [[UITOFP]]) #[[ATTR2]]333; CHECK-NEXT: ret float [[CALL]]334;335 %uitofp = uitofp i32 %arg to float336 %call = call float @llvm.exp10.f32(float %uitofp)337 ret float %call338}339 340; Could produce a nan because we don't know if the multiply is negative.341define float @ret_exp10_unknown_sign(float nofpclass(nan) %arg0, float nofpclass(nan) %arg1) {342; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_exp10_unknown_sign343; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR1]] {344; CHECK-NEXT: [[UNKNOWN_SIGN_NOT_NAN:%.*]] = fmul nnan float [[ARG0]], [[ARG1]]345; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.exp10.f32(float [[UNKNOWN_SIGN_NOT_NAN]]) #[[ATTR2]]346; CHECK-NEXT: ret float [[CALL]]347;348 %unknown.sign.not.nan = fmul nnan float %arg0, %arg1349 %call = call float @llvm.exp10.f32(float %unknown.sign.not.nan)350 ret float %call351}352;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:353; TUNIT: {{.*}}354