brintos

brintos / llvm-project-archived public Read only

0
0
Text · 139.2 KiB · a9ebdaa Raw
2994 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --version 22; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -use-constant-fp-for-scalable-splat=false -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-CV,TUNIT,TUNIT-CV3; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -use-constant-fp-for-scalable-splat=false -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-CV,CGSCC,CGSCC-CV4 5; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -use-constant-fp-for-scalable-splat -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-CI,TUNIT,TUNIT-CI6; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -use-constant-fp-for-scalable-splat -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-CI,CGSCC,CGSCC-CI7 8declare nofpclass(nan) float @ret_nofpclass_nan()9declare [2 x [3 x float]] @ret_array()10declare float @extern()11declare float @extern.f32(float)12declare void @extern.use(float)13declare void @extern.use.array([2 x [3 x float]])14declare void @llvm.assume(i1 noundef)15declare void @unknown()16declare half @llvm.fabs.f16(half)17declare float @llvm.fabs.f32(float)18declare void @extern.use.f16(half)19declare i1 @llvm.is.fpclass.f32(float, i32 immarg)20declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)21declare float @llvm.experimental.constrained.uitofp.f32.i32(i32, metadata, metadata)22declare float @llvm.arithmetic.fence.f32(float)23 24define float @returned_0() {25; CHECK-LABEL: define noundef nofpclass(nan inf nzero sub norm) float @returned_0() {26; CHECK-NEXT:    call void @unknown()27; CHECK-NEXT:    ret float 0.000000e+0028;29  call void @unknown()30  ret float 0.031}32 33define float @returned_neg0() {34; CHECK-LABEL: define noundef nofpclass(nan inf pzero sub norm) float @returned_neg0() {35; CHECK-NEXT:    call void @unknown()36; CHECK-NEXT:    ret float -0.000000e+0037;38  call void @unknown()39  ret float -0.040}41 42define float @returned_undef() {43; CHECK-LABEL: define nofpclass(all) float @returned_undef() {44; CHECK-NEXT:    call void @unknown()45; CHECK-NEXT:    ret float undef46;47  call void @unknown()48  ret float undef49}50 51define float @returned_poison() {52; CHECK-LABEL: define nofpclass(all) float @returned_poison() {53; CHECK-NEXT:    call void @unknown()54; CHECK-NEXT:    ret float poison55;56  call void @unknown()57  ret float poison58}59 60; Know nothing61define float @returned_freeze_poison() {62; CHECK-LABEL: define noundef float @returned_freeze_poison() {63; CHECK-NEXT:    call void @unknown()64; CHECK-NEXT:    [[FREEZE_POISON:%.*]] = freeze float poison65; CHECK-NEXT:    ret float [[FREEZE_POISON]]66;67  call void @unknown()68  %freeze.poison = freeze float poison69  ret float %freeze.poison70}71 72define double @returned_snan() {73; CHECK-LABEL: define noundef nofpclass(qnan inf zero sub norm) double @returned_snan() {74; CHECK-NEXT:    call void @unknown()75; CHECK-NEXT:    ret double 0x7FF000000000000176;77  call void @unknown()78  ret double 0x7FF000000000000179}80 81define double @returned_qnan() {82; CHECK-LABEL: define noundef nofpclass(snan inf zero sub norm) double @returned_qnan() {83; CHECK-NEXT:    call void @unknown()84; CHECK-NEXT:    ret double 0x7FF800000000000085;86  call void @unknown()87  ret double 0x7FF800000000000088}89 90define <2 x double> @returned_zero_vector() {91; CHECK-LABEL: define noundef nofpclass(nan inf nzero sub norm) <2 x double> @returned_zero_vector() {92; CHECK-NEXT:    call void @unknown()93; CHECK-NEXT:    ret <2 x double> zeroinitializer94;95  call void @unknown()96  ret <2 x double> zeroinitializer97}98 99define <2 x double> @returned_negzero_vector() {100; CHECK-LABEL: define noundef nofpclass(nan inf pzero sub norm) <2 x double> @returned_negzero_vector() {101; CHECK-NEXT:    call void @unknown()102; CHECK-NEXT:    ret <2 x double> splat (double -0.000000e+00)103;104  call void @unknown()105  ret <2 x double> <double -0.0, double -0.0>106}107 108; Test a vector element that's a constant but not ConstantFP.109define <2 x double> @returned_strange_constant_vector_elt() {110; CHECK-LABEL: define <2 x double> @returned_strange_constant_vector_elt() {111; CHECK-NEXT:    call void @unknown()112; CHECK-NEXT:    ret <2 x double> <double -0.000000e+00, double bitcast (i64 ptrtoint (ptr @unknown to i64) to double)>113;114  call void @unknown()115  ret <2 x double> <double -0.0, double bitcast (i64 ptrtoint (ptr @unknown to i64) to double)>116}117 118; Test a vector element that's undef119define <3 x double> @returned_undef_constant_vector_elt() {120; CHECK-LABEL: define <3 x double> @returned_undef_constant_vector_elt() {121; CHECK-NEXT:    call void @unknown()122; CHECK-NEXT:    ret <3 x double> <double -0.000000e+00, double 0.000000e+00, double undef>123;124  call void @unknown()125  ret <3 x double> <double -0.0, double 0.0, double undef>126}127 128; Test a vector element that's poison129define <3 x double> @returned_poison_constant_vector_elt() {130; CHECK-LABEL: define nofpclass(nan inf sub norm) <3 x double> @returned_poison_constant_vector_elt() {131; CHECK-NEXT:    call void @unknown()132; CHECK-NEXT:    ret <3 x double> <double -0.000000e+00, double 0.000000e+00, double poison>133;134  call void @unknown()135  ret <3 x double> <double -0.0, double 0.0, double poison>136}137 138define <2 x double> @returned_qnan_zero_vector() {139; CHECK-LABEL: define noundef nofpclass(snan inf nzero sub norm) <2 x double> @returned_qnan_zero_vector() {140; CHECK-NEXT:    call void @unknown()141; CHECK-NEXT:    ret <2 x double> <double 0x7FF8000000000000, double 0.000000e+00>142;143  call void @unknown()144  ret <2 x double> <double 0x7FF8000000000000, double 0.0>145}146 147; Return a float trivially nofpclass(nan) (call return attribute)148define float @return_nofpclass_nan_decl_return() {149; CHECK-LABEL: define nofpclass(nan) float @return_nofpclass_nan_decl_return() {150; CHECK-NEXT:    [[RET:%.*]] = call nofpclass(nan) float @ret_nofpclass_nan()151; CHECK-NEXT:    ret float [[RET]]152;153  %ret = call float @ret_nofpclass_nan()154  ret float %ret155}156 157; Return a float trivially nofpclass(nan) (argument attribute)158define float @return_nofpclass_nan_arg(float returned nofpclass(nan) %p) {159; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)160; CHECK-LABEL: define nofpclass(nan) float @return_nofpclass_nan_arg161; CHECK-SAME: (float returned nofpclass(nan) [[P:%.*]]) #[[ATTR3:[0-9]+]] {162; CHECK-NEXT:    ret float [[P]]163;164  ret float %p165}166 167define [2 x [3 x float]] @return_nofpclass_inf_ret_array() {168; CHECK-LABEL: define nofpclass(inf) [2 x [3 x float]] @return_nofpclass_inf_ret_array() {169; CHECK-NEXT:    [[RET:%.*]] = call nofpclass(inf) [2 x [3 x float]] @ret_array()170; CHECK-NEXT:    ret [2 x [3 x float]] [[RET]]171;172  %ret = call nofpclass(inf) [2 x [3 x float]]  @ret_array()173  ret [2 x [3 x float]] %ret174}175 176define float @returned_nnan_fadd(float %arg0, float %arg1) {177; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)178; CHECK-LABEL: define nofpclass(nan) float @returned_nnan_fadd179; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR3]] {180; CHECK-NEXT:    [[FADD:%.*]] = fadd nnan float [[ARG0]], [[ARG1]]181; CHECK-NEXT:    ret float [[FADD]]182;183  %fadd = fadd nnan float %arg0, %arg1184  ret float %fadd185}186 187define float @return_nofpclass_nan_callsite() {188; CHECK-LABEL: define nofpclass(nan) float @return_nofpclass_nan_callsite() {189; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nan) float @extern()190; CHECK-NEXT:    ret float [[CALL]]191;192  %call = call nofpclass(nan) float @extern()193  ret float %call194}195 196; Can union the return classes197define nofpclass(inf) float @return_ninf_nofpclass_nan_callsite() {198; CHECK-LABEL: define nofpclass(nan inf) float @return_ninf_nofpclass_nan_callsite() {199; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nan) float @extern()200; CHECK-NEXT:    ret float [[CALL]]201;202  %call = call nofpclass(nan) float @extern()203  ret float %call204}205 206define void @arg_used_by_nofpclass_nan_callsite(float %arg) {207; CHECK-LABEL: define void @arg_used_by_nofpclass_nan_callsite208; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) {209; CHECK-NEXT:    call void @extern.use(float nofpclass(nan) [[ARG]])210; CHECK-NEXT:    ret void211;212  call void @extern.use(float nofpclass(nan) %arg)213  ret void214}215 216; Callsite can union the incoming and outgoing217define void @ninf_arg_used_by_nofpclass_nan_callsite(float nofpclass(inf) %arg) {218; CHECK-LABEL: define void @ninf_arg_used_by_nofpclass_nan_callsite219; CHECK-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) {220; CHECK-NEXT:    call void @extern.use(float nofpclass(nan inf) [[ARG]])221; CHECK-NEXT:    ret void222;223  call void @extern.use(float nofpclass(nan) %arg)224  ret void225}226 227define void @ninf_arg_used_by_callsite_array([2 x [3 x float]] nofpclass(inf) %arg) {228; CHECK-LABEL: define void @ninf_arg_used_by_callsite_array229; CHECK-SAME: ([2 x [3 x float]] nofpclass(inf) [[ARG:%.*]]) {230; CHECK-NEXT:    call void @extern.use.array([2 x [3 x float]] nofpclass(inf) [[ARG]])231; CHECK-NEXT:    ret void232;233  call void @extern.use.array([2 x [3 x float]]  %arg)234  ret void235}236 237define void @nofpclass_call_use_after_unannotated_use(float %arg) {238; CHECK-LABEL: define void @nofpclass_call_use_after_unannotated_use239; CHECK-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) {240; CHECK-NEXT:    call void @extern(float nofpclass(nan inf) [[ARG]]) #[[ATTR17:[0-9]+]]241; CHECK-NEXT:    call void @extern(float nofpclass(nan inf) [[ARG]])242; CHECK-NEXT:    ret void243;244  call void @extern(float %arg) willreturn nounwind ; < annotate this use245  call void @extern(float nofpclass(nan inf) %arg)246  ret void247}248 249define float @mutually_recursive0(float %arg) {250; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)251; TUNIT-LABEL: define nofpclass(all) float @mutually_recursive0252; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR4:[0-9]+]] {253; TUNIT-NEXT:    ret float undef254;255; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)256; CGSCC-LABEL: define nofpclass(all) float @mutually_recursive0257; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR3]] {258; CGSCC-NEXT:    ret float undef259;260  %call = call float @mutually_recursive1(float %arg)261  ret float %call262}263 264define float @mutually_recursive1(float %arg) {265; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)266; TUNIT-LABEL: define nofpclass(all) float @mutually_recursive1267; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR4]] {268; TUNIT-NEXT:    ret float undef269;270; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)271; CGSCC-LABEL: define nofpclass(all) float @mutually_recursive1272; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR3]] {273; CGSCC-NEXT:    ret float undef274;275  %call = call float @mutually_recursive0(float %arg)276  ret float %call277}278 279define float @recursive_phi(ptr %ptr) {280; CHECK-LABEL: define nofpclass(nan) float @recursive_phi281; CHECK-SAME: (ptr nofree [[PTR:%.*]]) {282; CHECK-NEXT:  entry:283; CHECK-NEXT:    [[RET:%.*]] = call nofpclass(nan) float @ret_nofpclass_nan()284; CHECK-NEXT:    br label [[LOOP:%.*]]285; CHECK:       loop:286; CHECK-NEXT:    [[PHI:%.*]] = phi float [ [[RET]], [[ENTRY:%.*]] ], [ [[RET]], [[LOOP]] ]287; CHECK-NEXT:    [[COND:%.*]] = load volatile i1, ptr [[PTR]], align 1288; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]289; CHECK:       exit:290; CHECK-NEXT:    ret float [[RET]]291;292entry:293  %ret = call float @ret_nofpclass_nan()294  br label %loop295 296loop:297  %phi = phi float [%ret, %entry], [%phi, %loop]298  %cond = load volatile i1, ptr %ptr299  br i1 %cond, label %loop, label %exit300 301exit:302  ret float %phi303}304 305; Should be able to infer nofpclass(nan) return306define float @fcmp_uno_check(float %arg) local_unnamed_addr {307; CHECK-LABEL: define float @fcmp_uno_check308; CHECK-SAME: (float [[ARG:%.*]]) local_unnamed_addr {309; CHECK-NEXT:  entry:310; CHECK-NEXT:    [[ISNAN:%.*]] = fcmp uno float [[ARG]], 0.000000e+00311; CHECK-NEXT:    br i1 [[ISNAN]], label [[BB0:%.*]], label [[BB1:%.*]]312; CHECK:       bb0:313; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nan) float @ret_nofpclass_nan()314; CHECK-NEXT:    br label [[BB1]]315; CHECK:       bb1:316; CHECK-NEXT:    [[PHI:%.*]] = phi float [ [[CALL]], [[BB0]] ], [ [[ARG]], [[ENTRY:%.*]] ]317; CHECK-NEXT:    ret float [[PHI]]318;319entry:320  %isnan = fcmp uno float %arg, 0.0321  br i1 %isnan, label %bb0, label %bb1322 323bb0:324  %call = call float @ret_nofpclass_nan()325  br label %bb1326 327bb1:328  %phi = phi float [ %call, %bb0 ], [ %arg, %entry ]329  ret float %phi330}331 332; Should be able to infer nofpclass(nan) on %arg use333define void @fcmp_ord_guard_callsite_arg(float %arg) {334; CHECK-LABEL: define void @fcmp_ord_guard_callsite_arg335; CHECK-SAME: (float [[ARG:%.*]]) {336; CHECK-NEXT:  entry:337; CHECK-NEXT:    [[IS_NOT_NAN:%.*]] = fcmp ord float [[ARG]], 0.000000e+00338; CHECK-NEXT:    br i1 [[IS_NOT_NAN]], label [[BB0:%.*]], label [[BB1:%.*]]339; CHECK:       bb0:340; CHECK-NEXT:    call void @extern.use(float [[ARG]])341; CHECK-NEXT:    br label [[BB1]]342; CHECK:       bb1:343; CHECK-NEXT:    ret void344;345entry:346  %is.not.nan = fcmp ord float %arg, 0.0347  br i1 %is.not.nan, label %bb0, label %bb1348 349bb0:350  call void @extern.use(float %arg)351  br label %bb1352 353bb1:354  ret void355}356 357; Should be able to infer nofpclass on both %arg uses358define float @fcmp_ord_assume_callsite_arg_return(float %arg) {359; CHECK-LABEL: define float @fcmp_ord_assume_callsite_arg_return360; CHECK-SAME: (float returned [[ARG:%.*]]) {361; CHECK-NEXT:  entry:362; CHECK-NEXT:    [[IS_NOT_NAN:%.*]] = fcmp ord float [[ARG]], 0.000000e+00363; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[IS_NOT_NAN]]) #[[ATTR18:[0-9]+]]364; CHECK-NEXT:    call void @extern.use(float [[ARG]])365; CHECK-NEXT:    ret float [[ARG]]366;367entry:368  %is.not.nan = fcmp ord float %arg, 0.0369  call void @llvm.assume(i1 %is.not.nan)370  call void @extern.use(float %arg)371  ret float %arg372}373 374define internal float @returned_dead() {375; CHECK-LABEL: define internal nofpclass(nan inf nzero sub norm) float @returned_dead() {376; CHECK-NEXT:    call void @unknown()377; CHECK-NEXT:    ret float undef378;379  call void @unknown()380  ret float 0.0381}382 383define void @returned_dead_caller() {384; CHECK-LABEL: define void @returned_dead_caller() {385; CHECK-NEXT:    [[TMP1:%.*]] = call float @returned_dead()386; CHECK-NEXT:    ret void387;388  call float @returned_dead()389  ret void390}391 392define internal float @only_nofpclass_inf_callers(float %arg) {393; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)394; CHECK-LABEL: define internal float @only_nofpclass_inf_callers395; CHECK-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR3]] {396; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG]], [[ARG]]397; CHECK-NEXT:    ret float [[ADD]]398;399  %add = fadd float %arg, %arg400  ret float %add401}402 403define float @call_noinf_0(float nofpclass(inf) %arg) {404; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)405; TUNIT-LABEL: define float @call_noinf_0406; TUNIT-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR3]] {407; TUNIT-NEXT:    [[RESULT:%.*]] = call float @only_nofpclass_inf_callers(float nofpclass(inf) [[ARG]]) #[[ATTR19:[0-9]+]]408; TUNIT-NEXT:    ret float [[RESULT]]409;410; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)411; CGSCC-LABEL: define float @call_noinf_0412; CGSCC-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR4:[0-9]+]] {413; CGSCC-NEXT:    [[RESULT:%.*]] = call float @only_nofpclass_inf_callers(float nofpclass(inf) [[ARG]]) #[[ATTR19:[0-9]+]]414; CGSCC-NEXT:    ret float [[RESULT]]415;416  %result = call float @only_nofpclass_inf_callers(float %arg)417  ret float %result418}419 420define float @call_noinf_1(float %arg) {421; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)422; TUNIT-LABEL: define float @call_noinf_1423; TUNIT-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR3]] {424; TUNIT-NEXT:    [[RESULT:%.*]] = call float @only_nofpclass_inf_callers(float nofpclass(inf) [[ARG]]) #[[ATTR19]]425; TUNIT-NEXT:    ret float [[RESULT]]426;427; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)428; CGSCC-LABEL: define float @call_noinf_1429; CGSCC-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR4]] {430; CGSCC-NEXT:    [[RESULT:%.*]] = call float @only_nofpclass_inf_callers(float nofpclass(inf) [[ARG]]) #[[ATTR19]]431; CGSCC-NEXT:    ret float [[RESULT]]432;433  %result = call float @only_nofpclass_inf_callers(float nofpclass(inf) %arg)434  ret float %result435}436 437; TODO: Should be able to infer nofpclass(inf) on return438define internal float @only_nofpclass_inf_return_users(float %arg) {439; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)440; CHECK-LABEL: define internal float @only_nofpclass_inf_return_users441; CHECK-SAME: (float [[ARG:%.*]]) #[[ATTR3]] {442; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG]], [[ARG]]443; CHECK-NEXT:    ret float [[ADD]]444;445  %add = fadd float %arg, %arg446  ret float %add447}448 449define float @call_noinf_return_0(float %arg) {450; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)451; TUNIT-LABEL: define nofpclass(inf) float @call_noinf_return_0452; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR3]] {453; TUNIT-NEXT:    [[RESULT:%.*]] = call nofpclass(inf) float @only_nofpclass_inf_return_users(float [[ARG]]) #[[ATTR19]]454; TUNIT-NEXT:    ret float [[RESULT]]455;456; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)457; CGSCC-LABEL: define nofpclass(inf) float @call_noinf_return_0458; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR4]] {459; CGSCC-NEXT:    [[RESULT:%.*]] = call nofpclass(inf) float @only_nofpclass_inf_return_users(float [[ARG]]) #[[ATTR19]]460; CGSCC-NEXT:    ret float [[RESULT]]461;462  %result = call nofpclass(inf) float @only_nofpclass_inf_return_users(float %arg)463  ret float %result464}465 466define float @call_noinf_return_1(float %arg) {467; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)468; TUNIT-LABEL: define nofpclass(inf) float @call_noinf_return_1469; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR3]] {470; TUNIT-NEXT:    [[RESULT:%.*]] = call nofpclass(inf) float @only_nofpclass_inf_return_users(float [[ARG]]) #[[ATTR19]]471; TUNIT-NEXT:    ret float [[RESULT]]472;473; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)474; CGSCC-LABEL: define nofpclass(inf) float @call_noinf_return_1475; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR4]] {476; CGSCC-NEXT:    [[RESULT:%.*]] = call nofpclass(inf) float @only_nofpclass_inf_return_users(float [[ARG]]) #[[ATTR19]]477; CGSCC-NEXT:    ret float [[RESULT]]478;479  %result = call nofpclass(inf) float @only_nofpclass_inf_return_users(float %arg)480  ret float %result481}482 483define float @fcmp_olt_assume_one_0_callsite_arg_return(float %arg) {484; CHECK-LABEL: define float @fcmp_olt_assume_one_0_callsite_arg_return485; CHECK-SAME: (float returned [[ARG:%.*]]) {486; CHECK-NEXT:  entry:487; CHECK-NEXT:    [[IS_NOT_ZERO_OR_NAN:%.*]] = fcmp one float [[ARG]], 0.000000e+00488; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[IS_NOT_ZERO_OR_NAN]]) #[[ATTR18]]489; CHECK-NEXT:    call void @extern.use(float [[ARG]])490; CHECK-NEXT:    ret float [[ARG]]491;492entry:493  %is.not.zero.or.nan = fcmp one float %arg, 0.0494  call void @llvm.assume(i1 %is.not.zero.or.nan)495  call void @extern.use(float %arg)496  ret float %arg497}498 499define float @fcmp_olt_assume_une_0_callsite_arg_return(float %arg) {500; CHECK-LABEL: define float @fcmp_olt_assume_une_0_callsite_arg_return501; CHECK-SAME: (float returned [[ARG:%.*]]) {502; CHECK-NEXT:  entry:503; CHECK-NEXT:    [[IS_NOT_ZERO_OR_NAN:%.*]] = fcmp une float [[ARG]], 0.000000e+00504; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[IS_NOT_ZERO_OR_NAN]]) #[[ATTR18]]505; CHECK-NEXT:    call void @extern.use(float [[ARG]])506; CHECK-NEXT:    ret float [[ARG]]507;508entry:509  %is.not.zero.or.nan = fcmp une float %arg, 0.0510  call void @llvm.assume(i1 %is.not.zero.or.nan)511  call void @extern.use(float %arg)512  ret float %arg513}514 515define half @fcmp_assume_issubnormal_callsite_arg_return(half %arg) {516; CHECK-LABEL: define half @fcmp_assume_issubnormal_callsite_arg_return517; CHECK-SAME: (half returned [[ARG:%.*]]) {518; CHECK-NEXT:  entry:519; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) half @llvm.fabs.f16(half [[ARG]]) #[[ATTR20:[0-9]+]]520; CHECK-NEXT:    [[IS_SUBNORMAL:%.*]] = fcmp olt half [[FABS]], 0xH0400521; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[IS_SUBNORMAL]]) #[[ATTR18]]522; CHECK-NEXT:    call void @extern.use.f16(half [[ARG]])523; CHECK-NEXT:    ret half [[ARG]]524;525entry:526  %fabs = call half @llvm.fabs.f16(half %arg)527  %is.subnormal = fcmp olt half %fabs, 0xH0400528  call void @llvm.assume(i1 %is.subnormal)529  call void @extern.use.f16(half %arg)530  ret half %arg531}532 533; Assume is after the call, shouldn't mark callsite.534define half @fcmp_assume_not_inf_after_call(half %arg) {535; CHECK-LABEL: define half @fcmp_assume_not_inf_after_call536; CHECK-SAME: (half returned [[ARG:%.*]]) {537; CHECK-NEXT:  entry:538; CHECK-NEXT:    call void @extern.use.f16(half [[ARG]])539; CHECK-NEXT:    [[NOT_INF:%.*]] = fcmp oeq half [[ARG]], 0xH7C00540; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[NOT_INF]])541; CHECK-NEXT:    ret half [[ARG]]542;543entry:544  call void @extern.use.f16(half %arg)545  %not.inf = fcmp oeq half %arg, 0xH7C00546  call void @llvm.assume(i1 %not.inf)547  ret half %arg548}549 550; Assume not subnormal or zero, and not infinity551define half @fcmp_assume2_callsite_arg_return(half %arg) {552; CHECK-LABEL: define half @fcmp_assume2_callsite_arg_return553; CHECK-SAME: (half returned [[ARG:%.*]]) {554; CHECK-NEXT:  entry:555; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) half @llvm.fabs.f16(half [[ARG]]) #[[ATTR20]]556; CHECK-NEXT:    [[NOT_SUBNORMAL_OR_ZERO:%.*]] = fcmp oge half [[FABS]], 0xH0400557; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[NOT_SUBNORMAL_OR_ZERO]]) #[[ATTR18]]558; CHECK-NEXT:    [[NOT_INF:%.*]] = fcmp one half [[ARG]], 0xH7C00559; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[NOT_INF]]) #[[ATTR18]]560; CHECK-NEXT:    call void @extern.use.f16(half [[ARG]])561; CHECK-NEXT:    ret half [[ARG]]562;563entry:564  %fabs = call half @llvm.fabs.f16(half %arg)565  %not.subnormal.or.zero = fcmp oge half %fabs, 0xH0400566  call void @llvm.assume(i1 %not.subnormal.or.zero)567 568  %not.inf = fcmp one half %arg, 0xH7C00569  call void @llvm.assume(i1 %not.inf)570 571  call void @extern.use.f16(half %arg)572  ret half %arg573}574 575define float @is_fpclass_assume_arg_return(float %arg) {576; CHECK-LABEL: define float @is_fpclass_assume_arg_return577; CHECK-SAME: (float returned [[ARG:%.*]]) {578; CHECK-NEXT:  entry:579; CHECK-NEXT:    [[CLASS_TEST:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG]], i32 noundef 292) #[[ATTR20]]580; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[CLASS_TEST]]) #[[ATTR18]]581; CHECK-NEXT:    call void @extern.use(float [[ARG]])582; CHECK-NEXT:    ret float [[ARG]]583;584entry:585  %class.test = call i1 @llvm.is.fpclass.f32(float %arg, i32 292)586  call void @llvm.assume(i1 %class.test)587  call void @extern.use(float %arg)588  ret float %arg589}590 591; Make sure we don't get confused by looking at an unrelated assume592; based on the fabs of the value.593define half @assume_fcmp_fabs_with_other_fabs_assume(half %arg) {594; CHECK-LABEL: define half @assume_fcmp_fabs_with_other_fabs_assume595; CHECK-SAME: (half returned [[ARG:%.*]]) {596; CHECK-NEXT:  entry:597; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) half @llvm.fabs.f16(half [[ARG]]) #[[ATTR20]]598; CHECK-NEXT:    [[UNRELATED_FABS:%.*]] = fcmp one half [[FABS]], 0xH0000599; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[UNRELATED_FABS]]) #[[ATTR18]]600; CHECK-NEXT:    [[IS_SUBNORMAL:%.*]] = fcmp olt half [[FABS]], 0xH0400601; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[IS_SUBNORMAL]]) #[[ATTR18]]602; CHECK-NEXT:    call void @extern.use.f16(half [[ARG]])603; CHECK-NEXT:    call void @extern.use.f16(half nofpclass(ninf nzero nsub nnorm) [[FABS]])604; CHECK-NEXT:    ret half [[ARG]]605;606entry:607 608  %fabs = call half @llvm.fabs.f16(half %arg)609  %unrelated.fabs = fcmp one half %fabs, 0.0610  call void @llvm.assume(i1 %unrelated.fabs)611  %is.subnormal = fcmp olt half %fabs, 0xH0400612  call void @llvm.assume(i1 %is.subnormal)613  call void @extern.use.f16(half %arg)614  call void @extern.use.f16(half %fabs)615  ret half %arg616}617 618; Make sure if looking through the fabs finds a different source619; value, we still identify a test mask by ignoring the fabs620define half @assume_fcmp_fabs_with_other_fabs_assume_fallback(half %arg) {621; CHECK-LABEL: define half @assume_fcmp_fabs_with_other_fabs_assume_fallback622; CHECK-SAME: (half returned [[ARG:%.*]]) {623; CHECK-NEXT:  entry:624; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) half @llvm.fabs.f16(half [[ARG]]) #[[ATTR20]]625; CHECK-NEXT:    call void @llvm.assume(i1 noundef true) #[[ATTR18]]626; CHECK-NEXT:    [[UNRELATED_FABS:%.*]] = fcmp oeq half [[FABS]], 0xH0000627; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[UNRELATED_FABS]]) #[[ATTR18]]628; CHECK-NEXT:    call void @llvm.assume(i1 noundef true) #[[ATTR18]]629; CHECK-NEXT:    call void @extern.use.f16(half [[ARG]])630; CHECK-NEXT:    call void @extern.use.f16(half nofpclass(ninf nzero nsub nnorm) [[FABS]])631; CHECK-NEXT:    ret half [[ARG]]632;633entry:634 635  %fabs = call half @llvm.fabs.f16(half %arg)636 637  %one.inf = fcmp one half %arg, 0xH7C00638  call void @llvm.assume(i1 %one.inf)639 640  %unrelated.fabs = fcmp oeq half %fabs, 0.0641  call void @llvm.assume(i1 %unrelated.fabs)642 643  %is.subnormal = fcmp olt half %fabs, 0xH0400644  call void @llvm.assume(i1 %is.subnormal)645  call void @extern.use.f16(half %arg)646  call void @extern.use.f16(half %fabs)647  ret half %arg648}649 650define float @assume_bundles(i1 %c, float %ret) {651; CHECK-LABEL: define float @assume_bundles652; CHECK-SAME: (i1 noundef [[C:%.*]], float returned [[RET:%.*]]) {653; CHECK-NEXT:  entry:654; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]655; CHECK:       A:656; CHECK-NEXT:    call void @llvm.assume(i1 noundef true) #[[ATTR18]] [ "nofpclass"(float [[RET]], i32 3) ]657; CHECK-NEXT:    call void @extern.use(float nofpclass(nan) [[RET]])658; CHECK-NEXT:    ret float [[RET]]659; CHECK:       B:660; CHECK-NEXT:    call void @llvm.assume(i1 noundef true) [ "nofpclass"(float [[RET]], i32 12) ]661; CHECK-NEXT:    call void @extern.use(float nofpclass(ninf nnorm) [[RET]])662; CHECK-NEXT:    ret float [[RET]]663;664entry:665  br i1 %c, label %A, label %B666 667A:668  call void @llvm.assume(i1 true) [ "nofpclass"(float %ret, i32 3) ]669  call void @extern.use(float %ret)670  ret float %ret671 672B:673  call void @llvm.assume(i1 true) [ "nofpclass"(float %ret, i32 12) ]674  call void @extern.use(float %ret)675  ret float %ret676}677 678define float @returned_load(ptr %ptr) {679; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)680; CHECK-LABEL: define float @returned_load681; CHECK-SAME: (ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[PTR:%.*]]) #[[ATTR5:[0-9]+]] {682; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[PTR]], align 4683; CHECK-NEXT:    ret float [[LOAD]]684;685  %load = load float, ptr %ptr686  ret float %load687}688 689define float @pass_nofpclass_inf_through_memory(float nofpclass(inf) %arg) {690; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)691; TUNIT-LABEL: define float @pass_nofpclass_inf_through_memory692; TUNIT-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR3]] {693; TUNIT-NEXT:    [[ALLOCA:%.*]] = alloca float, align 4694; TUNIT-NEXT:    store float [[ARG]], ptr [[ALLOCA]], align 4695; TUNIT-NEXT:    [[RET:%.*]] = call float @returned_load(ptr noalias nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[ALLOCA]]) #[[ATTR21:[0-9]+]]696; TUNIT-NEXT:    ret float [[RET]]697;698; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)699; CGSCC-LABEL: define float @pass_nofpclass_inf_through_memory700; CGSCC-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR4]] {701; CGSCC-NEXT:    [[ALLOCA:%.*]] = alloca float, align 4702; CGSCC-NEXT:    store float [[ARG]], ptr [[ALLOCA]], align 4703; CGSCC-NEXT:    [[RET:%.*]] = call float @returned_load(ptr noalias nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[ALLOCA]]) #[[ATTR21:[0-9]+]]704; CGSCC-NEXT:    ret float [[RET]]705;706  %alloca = alloca float707  store float %arg, ptr %alloca708  %ret = call float @returned_load(ptr %alloca)709  ret float %ret710}711 712define float @returned_fabs(float %x) {713; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)714; TUNIT-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs715; TUNIT-SAME: (float [[X:%.*]]) #[[ATTR3]] {716; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR22:[0-9]+]]717; TUNIT-NEXT:    ret float [[FABS]]718;719; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)720; CGSCC-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs721; CGSCC-SAME: (float [[X:%.*]]) #[[ATTR3]] {722; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR19]]723; CGSCC-NEXT:    ret float [[FABS]]724;725  %fabs = call float @llvm.fabs.f32(float %x)726  ret float %fabs727}728 729define float @returned_fabs_nosnan(float nofpclass(snan) %x) {730; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)731; TUNIT-LABEL: define nofpclass(snan ninf nzero nsub nnorm) float @returned_fabs_nosnan732; TUNIT-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR3]] {733; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(snan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(snan) [[X]]) #[[ATTR22]]734; TUNIT-NEXT:    ret float [[FABS]]735;736; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)737; CGSCC-LABEL: define nofpclass(snan ninf nzero nsub nnorm) float @returned_fabs_nosnan738; CGSCC-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR3]] {739; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(snan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(snan) [[X]]) #[[ATTR19]]740; CGSCC-NEXT:    ret float [[FABS]]741;742  %fabs = call float @llvm.fabs.f32(float %x)743  ret float %fabs744}745 746define float @returned_fabs_noqnan(float nofpclass(qnan) %x) {747; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)748; TUNIT-LABEL: define nofpclass(qnan ninf nzero nsub nnorm) float @returned_fabs_noqnan749; TUNIT-SAME: (float nofpclass(qnan) [[X:%.*]]) #[[ATTR3]] {750; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan) [[X]]) #[[ATTR22]]751; TUNIT-NEXT:    ret float [[FABS]]752;753; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)754; CGSCC-LABEL: define nofpclass(qnan ninf nzero nsub nnorm) float @returned_fabs_noqnan755; CGSCC-SAME: (float nofpclass(qnan) [[X:%.*]]) #[[ATTR3]] {756; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan) [[X]]) #[[ATTR19]]757; CGSCC-NEXT:    ret float [[FABS]]758;759  %fabs = call float @llvm.fabs.f32(float %x)760  ret float %fabs761}762 763define float @returned_fabs_nonan(float nofpclass(nan) %x) {764; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)765; TUNIT-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_nonan766; TUNIT-SAME: (float nofpclass(nan) [[X:%.*]]) #[[ATTR3]] {767; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan) [[X]]) #[[ATTR22]]768; TUNIT-NEXT:    ret float [[FABS]]769;770; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)771; CGSCC-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_nonan772; CGSCC-SAME: (float nofpclass(nan) [[X:%.*]]) #[[ATTR3]] {773; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan) [[X]]) #[[ATTR19]]774; CGSCC-NEXT:    ret float [[FABS]]775;776  %fabs = call float @llvm.fabs.f32(float %x)777  ret float %fabs778}779 780define float @returned_fabs_noinf(float nofpclass(inf) %x) {781; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)782; TUNIT-LABEL: define nofpclass(inf nzero nsub nnorm) float @returned_fabs_noinf783; TUNIT-SAME: (float nofpclass(inf) [[X:%.*]]) #[[ATTR3]] {784; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(inf) [[X]]) #[[ATTR22]]785; TUNIT-NEXT:    ret float [[FABS]]786;787; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)788; CGSCC-LABEL: define nofpclass(inf nzero nsub nnorm) float @returned_fabs_noinf789; CGSCC-SAME: (float nofpclass(inf) [[X:%.*]]) #[[ATTR3]] {790; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(inf) [[X]]) #[[ATTR19]]791; CGSCC-NEXT:    ret float [[FABS]]792;793  %fabs = call float @llvm.fabs.f32(float %x)794  ret float %fabs795}796 797define float @returned_fabs_nopos(float nofpclass(psub pnorm pinf) %x) {798; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)799; TUNIT-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopos800; TUNIT-SAME: (float nofpclass(pinf psub pnorm) [[X:%.*]]) #[[ATTR3]] {801; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf psub pnorm) [[X]]) #[[ATTR22]]802; TUNIT-NEXT:    ret float [[FABS]]803;804; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)805; CGSCC-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopos806; CGSCC-SAME: (float nofpclass(pinf psub pnorm) [[X:%.*]]) #[[ATTR3]] {807; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf psub pnorm) [[X]]) #[[ATTR19]]808; CGSCC-NEXT:    ret float [[FABS]]809;810  %fabs = call float @llvm.fabs.f32(float %x)811  ret float %fabs812}813 814define float @returned_fabs_nopos_nopzero(float nofpclass(psub pnorm pinf pzero) %x) {815; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)816; TUNIT-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopos_nopzero817; TUNIT-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR3]] {818; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf pzero psub pnorm) [[X]]) #[[ATTR22]]819; TUNIT-NEXT:    ret float [[FABS]]820;821; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)822; CGSCC-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopos_nopzero823; CGSCC-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR3]] {824; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf pzero psub pnorm) [[X]]) #[[ATTR19]]825; CGSCC-NEXT:    ret float [[FABS]]826;827  %fabs = call float @llvm.fabs.f32(float %x)828  ret float %fabs829}830 831define float @returned_fabs_nopos_nozero(float nofpclass(psub pnorm pinf zero) %x) {832; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)833; TUNIT-LABEL: define nofpclass(ninf zero nsub nnorm) float @returned_fabs_nopos_nozero834; TUNIT-SAME: (float nofpclass(pinf zero psub pnorm) [[X:%.*]]) #[[ATTR3]] {835; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf zero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf zero psub pnorm) [[X]]) #[[ATTR22]]836; TUNIT-NEXT:    ret float [[FABS]]837;838; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)839; CGSCC-LABEL: define nofpclass(ninf zero nsub nnorm) float @returned_fabs_nopos_nozero840; CGSCC-SAME: (float nofpclass(pinf zero psub pnorm) [[X:%.*]]) #[[ATTR3]] {841; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf zero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf zero psub pnorm) [[X]]) #[[ATTR19]]842; CGSCC-NEXT:    ret float [[FABS]]843;844  %fabs = call float @llvm.fabs.f32(float %x)845  ret float %fabs846}847 848define float @returned_fabs_nopos_nonan(float nofpclass(psub pnorm pinf nan) %x) {849; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)850; TUNIT-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_nopos_nonan851; TUNIT-SAME: (float nofpclass(nan pinf psub pnorm) [[X:%.*]]) #[[ATTR3]] {852; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan pinf psub pnorm) [[X]]) #[[ATTR22]]853; TUNIT-NEXT:    ret float [[FABS]]854;855; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)856; CGSCC-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_nopos_nonan857; CGSCC-SAME: (float nofpclass(nan pinf psub pnorm) [[X:%.*]]) #[[ATTR3]] {858; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan pinf psub pnorm) [[X]]) #[[ATTR19]]859; CGSCC-NEXT:    ret float [[FABS]]860;861  %fabs = call float @llvm.fabs.f32(float %x)862  ret float %fabs863}864 865define float @returned_fabs_noneg(float nofpclass(nsub nnorm ninf) %x) {866; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)867; TUNIT-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_noneg868; TUNIT-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]]) #[[ATTR3]] {869; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nsub nnorm) [[X]]) #[[ATTR22]]870; TUNIT-NEXT:    ret float [[FABS]]871;872; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)873; CGSCC-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_noneg874; CGSCC-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]]) #[[ATTR3]] {875; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nsub nnorm) [[X]]) #[[ATTR19]]876; CGSCC-NEXT:    ret float [[FABS]]877;878  %fabs = call float @llvm.fabs.f32(float %x)879  ret float %fabs880}881 882define float @returned_fabs_noneg_nonzero(float nofpclass(nsub nnorm ninf nzero) %x) {883; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)884; TUNIT-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_noneg_nonzero885; TUNIT-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR3]] {886; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nzero nsub nnorm) [[X]]) #[[ATTR22]]887; TUNIT-NEXT:    ret float [[FABS]]888;889; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)890; CGSCC-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_noneg_nonzero891; CGSCC-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR3]] {892; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nzero nsub nnorm) [[X]]) #[[ATTR19]]893; CGSCC-NEXT:    ret float [[FABS]]894;895  %fabs = call float @llvm.fabs.f32(float %x)896  ret float %fabs897}898 899define float @returned_fabs_noneg_nozero(float nofpclass(nsub nnorm ninf zero) %x) {900; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)901; TUNIT-LABEL: define nofpclass(ninf zero nsub nnorm) float @returned_fabs_noneg_nozero902; TUNIT-SAME: (float nofpclass(ninf zero nsub nnorm) [[X:%.*]]) #[[ATTR3]] {903; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf zero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf zero nsub nnorm) [[X]]) #[[ATTR22]]904; TUNIT-NEXT:    ret float [[FABS]]905;906; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)907; CGSCC-LABEL: define nofpclass(ninf zero nsub nnorm) float @returned_fabs_noneg_nozero908; CGSCC-SAME: (float nofpclass(ninf zero nsub nnorm) [[X:%.*]]) #[[ATTR3]] {909; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf zero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf zero nsub nnorm) [[X]]) #[[ATTR19]]910; CGSCC-NEXT:    ret float [[FABS]]911;912  %fabs = call float @llvm.fabs.f32(float %x)913  ret float %fabs914}915 916define float @returned_fabs_noneg_nonan(float nofpclass(nsub nnorm ninf nan) %x) {917; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)918; TUNIT-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_noneg_nonan919; TUNIT-SAME: (float nofpclass(nan ninf nsub nnorm) [[X:%.*]]) #[[ATTR3]] {920; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan ninf nsub nnorm) [[X]]) #[[ATTR22]]921; TUNIT-NEXT:    ret float [[FABS]]922;923; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)924; CGSCC-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_noneg_nonan925; CGSCC-SAME: (float nofpclass(nan ninf nsub nnorm) [[X:%.*]]) #[[ATTR3]] {926; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan ninf nsub nnorm) [[X]]) #[[ATTR19]]927; CGSCC-NEXT:    ret float [[FABS]]928;929  %fabs = call float @llvm.fabs.f32(float %x)930  ret float %fabs931}932 933define float @returned_fabs_nonsub_nopnorm_nonzero(float nofpclass(nsub pnorm nzero) %x) {934; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)935; TUNIT-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nonsub_nopnorm_nonzero936; TUNIT-SAME: (float nofpclass(nzero nsub pnorm) [[X:%.*]]) #[[ATTR3]] {937; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nzero nsub pnorm) [[X]]) #[[ATTR22]]938; TUNIT-NEXT:    ret float [[FABS]]939;940; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)941; CGSCC-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nonsub_nopnorm_nonzero942; CGSCC-SAME: (float nofpclass(nzero nsub pnorm) [[X:%.*]]) #[[ATTR3]] {943; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nzero nsub pnorm) [[X]]) #[[ATTR19]]944; CGSCC-NEXT:    ret float [[FABS]]945;946  %fabs = call float @llvm.fabs.f32(float %x)947  ret float %fabs948}949 950define float @returned_fabs_nopsub_nonnorm_nopzero(float nofpclass(psub nnorm pzero) %x) {951; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)952; TUNIT-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopsub_nonnorm_nopzero953; TUNIT-SAME: (float nofpclass(pzero psub nnorm) [[X:%.*]]) #[[ATTR3]] {954; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pzero psub nnorm) [[X]]) #[[ATTR22]]955; TUNIT-NEXT:    ret float [[FABS]]956;957; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)958; CGSCC-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopsub_nonnorm_nopzero959; CGSCC-SAME: (float nofpclass(pzero psub nnorm) [[X:%.*]]) #[[ATTR3]] {960; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pzero psub nnorm) [[X]]) #[[ATTR19]]961; CGSCC-NEXT:    ret float [[FABS]]962;963  %fabs = call float @llvm.fabs.f32(float %x)964  ret float %fabs965}966 967define float @returned_fabs_nonnorm_nozero(float nofpclass(nnorm nzero) %x) {968; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)969; TUNIT-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nonnorm_nozero970; TUNIT-SAME: (float nofpclass(nzero nnorm) [[X:%.*]]) #[[ATTR3]] {971; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nzero nnorm) [[X]]) #[[ATTR22]]972; TUNIT-NEXT:    ret float [[FABS]]973;974; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)975; CGSCC-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nonnorm_nozero976; CGSCC-SAME: (float nofpclass(nzero nnorm) [[X:%.*]]) #[[ATTR3]] {977; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nzero nnorm) [[X]]) #[[ATTR19]]978; CGSCC-NEXT:    ret float [[FABS]]979;980  %fabs = call float @llvm.fabs.f32(float %x)981  ret float %fabs982}983 984define float @returned_fneg(float %x) {985; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)986; CHECK-LABEL: define float @returned_fneg987; CHECK-SAME: (float [[X:%.*]]) #[[ATTR3]] {988; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]989; CHECK-NEXT:    ret float [[FNEG]]990;991  %fneg = fneg float %x992  ret float %fneg993}994 995define float @returned_fneg_nosnan(float nofpclass(snan) %x) {996; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)997; CHECK-LABEL: define nofpclass(snan) float @returned_fneg_nosnan998; CHECK-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR3]] {999; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1000; CHECK-NEXT:    ret float [[FNEG]]1001;1002  %fneg = fneg float %x1003  ret float %fneg1004}1005 1006define float @returned_fneg_noqnan(float nofpclass(qnan) %x) {1007; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1008; CHECK-LABEL: define nofpclass(qnan) float @returned_fneg_noqnan1009; CHECK-SAME: (float nofpclass(qnan) [[X:%.*]]) #[[ATTR3]] {1010; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1011; CHECK-NEXT:    ret float [[FNEG]]1012;1013  %fneg = fneg float %x1014  ret float %fneg1015}1016 1017define float @returned_fneg_nosnan_ninf_flag(float nofpclass(snan) %x) {1018; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1019; CHECK-LABEL: define nofpclass(snan inf) float @returned_fneg_nosnan_ninf_flag1020; CHECK-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR3]] {1021; CHECK-NEXT:    [[FNEG:%.*]] = fneg ninf float [[X]]1022; CHECK-NEXT:    ret float [[FNEG]]1023;1024  %fneg = fneg ninf float %x1025  ret float %fneg1026}1027 1028define float @returned_fneg_nonan(float nofpclass(nan) %x) {1029; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1030; CHECK-LABEL: define nofpclass(nan) float @returned_fneg_nonan1031; CHECK-SAME: (float nofpclass(nan) [[X:%.*]]) #[[ATTR3]] {1032; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1033; CHECK-NEXT:    ret float [[FNEG]]1034;1035  %fneg = fneg float %x1036  ret float %fneg1037}1038 1039define float @returned_fneg_noinf(float nofpclass(inf) %x) {1040; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1041; CHECK-LABEL: define nofpclass(inf) float @returned_fneg_noinf1042; CHECK-SAME: (float nofpclass(inf) [[X:%.*]]) #[[ATTR3]] {1043; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1044; CHECK-NEXT:    ret float [[FNEG]]1045;1046  %fneg = fneg float %x1047  ret float %fneg1048}1049 1050define float @returned_fneg_noneg(float nofpclass(ninf nsub nnorm nzero) %x) {1051; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1052; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_noneg1053; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR3]] {1054; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1055; CHECK-NEXT:    ret float [[FNEG]]1056;1057  %fneg = fneg float %x1058  ret float %fneg1059}1060 1061define float @returned_fneg_noneg_nnan_flag(float nofpclass(ninf nsub nnorm nzero) %x) {1062; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1063; CHECK-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @returned_fneg_noneg_nnan_flag1064; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR3]] {1065; CHECK-NEXT:    [[FNEG:%.*]] = fneg nnan float [[X]]1066; CHECK-NEXT:    ret float [[FNEG]]1067;1068  %fneg = fneg nnan float %x1069  ret float %fneg1070}1071 1072define float @returned_fneg_nonsubnnorm(float nofpclass(nsub nnorm) %x) {1073; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1074; CHECK-LABEL: define nofpclass(psub pnorm) float @returned_fneg_nonsubnnorm1075; CHECK-SAME: (float nofpclass(nsub nnorm) [[X:%.*]]) #[[ATTR3]] {1076; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1077; CHECK-NEXT:    ret float [[FNEG]]1078;1079  %fneg = fneg float %x1080  ret float %fneg1081}1082 1083define float @returned_fneg_nopos(float nofpclass(pinf psub pnorm pzero) %x) {1084; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1085; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fneg_nopos1086; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR3]] {1087; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1088; CHECK-NEXT:    ret float [[FNEG]]1089;1090  %fneg = fneg float %x1091  ret float %fneg1092}1093 1094define float @returned_fneg_nopnormpsub(float nofpclass(psub pnorm) %x) {1095; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1096; CHECK-LABEL: define nofpclass(nsub nnorm) float @returned_fneg_nopnormpsub1097; CHECK-SAME: (float nofpclass(psub pnorm) [[X:%.*]]) #[[ATTR3]] {1098; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1099; CHECK-NEXT:    ret float [[FNEG]]1100;1101  %fneg = fneg float %x1102  ret float %fneg1103}1104 1105define float @returned_fneg_mixed(float nofpclass(psub nnorm nzero qnan ninf) %x) {1106; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1107; CHECK-LABEL: define nofpclass(qnan pinf pzero nsub pnorm) float @returned_fneg_mixed1108; CHECK-SAME: (float nofpclass(qnan ninf nzero psub nnorm) [[X:%.*]]) #[[ATTR3]] {1109; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]1110; CHECK-NEXT:    ret float [[FNEG]]1111;1112  %fneg = fneg float %x1113  ret float %fneg1114}1115 1116define float @returned_fneg_fabs(float %x) {1117; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1118; TUNIT-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs1119; TUNIT-SAME: (float [[X:%.*]]) #[[ATTR3]] {1120; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR22]]1121; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1122; TUNIT-NEXT:    ret float [[FNEG_FABS]]1123;1124; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1125; CGSCC-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs1126; CGSCC-SAME: (float [[X:%.*]]) #[[ATTR3]] {1127; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR19]]1128; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1129; CGSCC-NEXT:    ret float [[FNEG_FABS]]1130;1131  %fabs = call float @llvm.fabs.f32(float %x)1132  %fneg.fabs = fneg float %fabs1133  ret float %fneg.fabs1134}1135 1136define float @returned_fneg_fabs_nosnan(float nofpclass(snan) %x) {1137; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1138; TUNIT-LABEL: define nofpclass(snan pinf pzero psub pnorm) float @returned_fneg_fabs_nosnan1139; TUNIT-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR3]] {1140; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(snan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(snan) [[X]]) #[[ATTR22]]1141; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1142; TUNIT-NEXT:    ret float [[FNEG_FABS]]1143;1144; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1145; CGSCC-LABEL: define nofpclass(snan pinf pzero psub pnorm) float @returned_fneg_fabs_nosnan1146; CGSCC-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR3]] {1147; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(snan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(snan) [[X]]) #[[ATTR19]]1148; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1149; CGSCC-NEXT:    ret float [[FNEG_FABS]]1150;1151  %fabs = call float @llvm.fabs.f32(float %x)1152  %fneg.fabs = fneg float %fabs1153  ret float %fneg.fabs1154}1155 1156define float @returned_fneg_fabs_noqnan(float nofpclass(qnan) %x) {1157; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1158; TUNIT-LABEL: define nofpclass(qnan pinf pzero psub pnorm) float @returned_fneg_fabs_noqnan1159; TUNIT-SAME: (float nofpclass(qnan) [[X:%.*]]) #[[ATTR3]] {1160; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan) [[X]]) #[[ATTR22]]1161; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1162; TUNIT-NEXT:    ret float [[FNEG_FABS]]1163;1164; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1165; CGSCC-LABEL: define nofpclass(qnan pinf pzero psub pnorm) float @returned_fneg_fabs_noqnan1166; CGSCC-SAME: (float nofpclass(qnan) [[X:%.*]]) #[[ATTR3]] {1167; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan) [[X]]) #[[ATTR19]]1168; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1169; CGSCC-NEXT:    ret float [[FNEG_FABS]]1170;1171  %fabs = call float @llvm.fabs.f32(float %x)1172  %fneg.fabs = fneg float %fabs1173  ret float %fneg.fabs1174}1175 1176define float @returned_fneg_fabs_nonan(float nofpclass(nan) %x) {1177; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1178; TUNIT-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @returned_fneg_fabs_nonan1179; TUNIT-SAME: (float nofpclass(nan) [[X:%.*]]) #[[ATTR3]] {1180; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan) [[X]]) #[[ATTR22]]1181; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1182; TUNIT-NEXT:    ret float [[FNEG_FABS]]1183;1184; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1185; CGSCC-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @returned_fneg_fabs_nonan1186; CGSCC-SAME: (float nofpclass(nan) [[X:%.*]]) #[[ATTR3]] {1187; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan) [[X]]) #[[ATTR19]]1188; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1189; CGSCC-NEXT:    ret float [[FNEG_FABS]]1190;1191  %fabs = call float @llvm.fabs.f32(float %x)1192  %fneg.fabs = fneg float %fabs1193  ret float %fneg.fabs1194}1195 1196define float @returned_fneg_fabs_noneg(float nofpclass(ninf nsub nnorm nzero) %x) {1197; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1198; TUNIT-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs_noneg1199; TUNIT-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR3]] {1200; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nzero nsub nnorm) [[X]]) #[[ATTR22]]1201; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1202; TUNIT-NEXT:    ret float [[FNEG_FABS]]1203;1204; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1205; CGSCC-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs_noneg1206; CGSCC-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR3]] {1207; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nzero nsub nnorm) [[X]]) #[[ATTR19]]1208; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1209; CGSCC-NEXT:    ret float [[FNEG_FABS]]1210;1211  %fabs = call float @llvm.fabs.f32(float %x)1212  %fneg.fabs = fneg float %fabs1213  ret float %fneg.fabs1214}1215 1216define float @returned_fneg_fabs_nopos(float nofpclass(pinf psub pnorm pzero) %x) {1217; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1218; TUNIT-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs_nopos1219; TUNIT-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR3]] {1220; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf pzero psub pnorm) [[X]]) #[[ATTR22]]1221; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1222; TUNIT-NEXT:    ret float [[FNEG_FABS]]1223;1224; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1225; CGSCC-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs_nopos1226; CGSCC-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR3]] {1227; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf pzero psub pnorm) [[X]]) #[[ATTR19]]1228; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1229; CGSCC-NEXT:    ret float [[FNEG_FABS]]1230;1231  %fabs = call float @llvm.fabs.f32(float %x)1232  %fneg.fabs = fneg float %fabs1233  ret float %fneg.fabs1234}1235 1236define float @returned_fneg_fabs_mixed(float nofpclass(psub nnorm nzero qnan ninf) %x) {1237; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1238; TUNIT-LABEL: define nofpclass(qnan pinf pzero psub pnorm) float @returned_fneg_fabs_mixed1239; TUNIT-SAME: (float nofpclass(qnan ninf nzero psub nnorm) [[X:%.*]]) #[[ATTR3]] {1240; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan ninf nzero psub nnorm) [[X]]) #[[ATTR22]]1241; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1242; TUNIT-NEXT:    ret float [[FNEG_FABS]]1243;1244; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1245; CGSCC-LABEL: define nofpclass(qnan pinf pzero psub pnorm) float @returned_fneg_fabs_mixed1246; CGSCC-SAME: (float nofpclass(qnan ninf nzero psub nnorm) [[X:%.*]]) #[[ATTR3]] {1247; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan ninf nzero psub nnorm) [[X]]) #[[ATTR19]]1248; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1249; CGSCC-NEXT:    ret float [[FNEG_FABS]]1250;1251  %fabs = call float @llvm.fabs.f32(float %x)1252  %fneg.fabs = fneg float %fabs1253  ret float %fneg.fabs1254}1255 1256define float @returned_fneg_fabs_ninf_flag_fabs(float %x) {1257; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1258; TUNIT-LABEL: define nofpclass(inf pzero psub pnorm) float @returned_fneg_fabs_ninf_flag_fabs1259; TUNIT-SAME: (float [[X:%.*]]) #[[ATTR3]] {1260; TUNIT-NEXT:    [[FABS:%.*]] = call ninf nofpclass(inf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR22]]1261; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1262; TUNIT-NEXT:    ret float [[FNEG_FABS]]1263;1264; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1265; CGSCC-LABEL: define nofpclass(inf pzero psub pnorm) float @returned_fneg_fabs_ninf_flag_fabs1266; CGSCC-SAME: (float [[X:%.*]]) #[[ATTR3]] {1267; CGSCC-NEXT:    [[FABS:%.*]] = call ninf nofpclass(inf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR19]]1268; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]1269; CGSCC-NEXT:    ret float [[FNEG_FABS]]1270;1271  %fabs = call ninf float @llvm.fabs.f32(float %x)1272  %fneg.fabs = fneg float %fabs1273  ret float %fneg.fabs1274}1275 1276define float @returned_fneg_fabs_ninf_flag_fneg(float %x) {1277; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1278; TUNIT-LABEL: define nofpclass(inf pzero psub pnorm) float @returned_fneg_fabs_ninf_flag_fneg1279; TUNIT-SAME: (float [[X:%.*]]) #[[ATTR3]] {1280; TUNIT-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR22]]1281; TUNIT-NEXT:    [[FNEG_FABS:%.*]] = fneg ninf float [[FABS]]1282; TUNIT-NEXT:    ret float [[FNEG_FABS]]1283;1284; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1285; CGSCC-LABEL: define nofpclass(inf pzero psub pnorm) float @returned_fneg_fabs_ninf_flag_fneg1286; CGSCC-SAME: (float [[X:%.*]]) #[[ATTR3]] {1287; CGSCC-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR19]]1288; CGSCC-NEXT:    [[FNEG_FABS:%.*]] = fneg ninf float [[FABS]]1289; CGSCC-NEXT:    ret float [[FNEG_FABS]]1290;1291  %fabs = call float @llvm.fabs.f32(float %x)1292  %fneg.fabs = fneg ninf float %fabs1293  ret float %fneg.fabs1294}1295 1296define float @uitofp_i32_to_f32(i32 %arg) {1297; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1298; CHECK-LABEL: define nofpclass(nan inf nzero sub nnorm) float @uitofp_i32_to_f321299; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {1300; CHECK-NEXT:    [[CVT:%.*]] = uitofp i32 [[ARG]] to float1301; CHECK-NEXT:    ret float [[CVT]]1302;1303  %cvt = uitofp i32 %arg to float1304  ret float %cvt1305}1306 1307define float @sitofp_i32_to_f32(i32 %arg) {1308; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1309; CHECK-LABEL: define nofpclass(nan inf nzero sub) float @sitofp_i32_to_f321310; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {1311; CHECK-NEXT:    [[CVT:%.*]] = sitofp i32 [[ARG]] to float1312; CHECK-NEXT:    ret float [[CVT]]1313;1314  %cvt = sitofp i32 %arg to float1315  ret float %cvt1316}1317 1318define <2 x float> @uitofp_v2i32_to_v2f32(<2 x i32> %arg) {1319; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1320; CHECK-LABEL: define nofpclass(nan inf nzero sub nnorm) <2 x float> @uitofp_v2i32_to_v2f321321; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR3]] {1322; CHECK-NEXT:    [[CVT:%.*]] = uitofp <2 x i32> [[ARG]] to <2 x float>1323; CHECK-NEXT:    ret <2 x float> [[CVT]]1324;1325  %cvt = uitofp <2 x i32> %arg to <2 x float>1326  ret <2 x float> %cvt1327}1328 1329define <2 x float> @sitofp_v2i32_to_v2i32(<2 x i32> %arg) {1330; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1331; CHECK-LABEL: define nofpclass(nan inf nzero sub) <2 x float> @sitofp_v2i32_to_v2i321332; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR3]] {1333; CHECK-NEXT:    [[CVT:%.*]] = sitofp <2 x i32> [[ARG]] to <2 x float>1334; CHECK-NEXT:    ret <2 x float> [[CVT]]1335;1336  %cvt = sitofp <2 x i32> %arg to <2 x float>1337  ret <2 x float> %cvt1338}1339 1340define half @uitofp_i17_to_f16(i17 %arg) {1341; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1342; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) half @uitofp_i17_to_f161343; CHECK-SAME: (i17 [[ARG:%.*]]) #[[ATTR3]] {1344; CHECK-NEXT:    [[CVT:%.*]] = uitofp i17 [[ARG]] to half1345; CHECK-NEXT:    ret half [[CVT]]1346;1347  %cvt = uitofp i17 %arg to half1348  ret half %cvt1349}1350 1351define half @sitofp_i17_to_f16(i17 %arg) {1352; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1353; CHECK-LABEL: define nofpclass(nan nzero sub) half @sitofp_i17_to_f161354; CHECK-SAME: (i17 [[ARG:%.*]]) #[[ATTR3]] {1355; CHECK-NEXT:    [[CVT:%.*]] = sitofp i17 [[ARG]] to half1356; CHECK-NEXT:    ret half [[CVT]]1357;1358  %cvt = sitofp i17 %arg to half1359  ret half %cvt1360}1361 1362define <2 x half> @uitofp_v2i17_to_v2f16(<2 x i17> %arg) {1363; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1364; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) <2 x half> @uitofp_v2i17_to_v2f161365; CHECK-SAME: (<2 x i17> [[ARG:%.*]]) #[[ATTR3]] {1366; CHECK-NEXT:    [[CVT:%.*]] = uitofp <2 x i17> [[ARG]] to <2 x half>1367; CHECK-NEXT:    ret <2 x half> [[CVT]]1368;1369  %cvt = uitofp <2 x i17> %arg to <2 x half>1370  ret <2 x half> %cvt1371}1372 1373define <2 x half> @sitofp_v2i17_to_v2i17(<2 x i17> %arg) {1374; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1375; CHECK-LABEL: define nofpclass(nan nzero sub) <2 x half> @sitofp_v2i17_to_v2i171376; CHECK-SAME: (<2 x i17> [[ARG:%.*]]) #[[ATTR3]] {1377; CHECK-NEXT:    [[CVT:%.*]] = sitofp <2 x i17> [[ARG]] to <2 x half>1378; CHECK-NEXT:    ret <2 x half> [[CVT]]1379;1380  %cvt = sitofp <2 x i17> %arg to <2 x half>1381  ret <2 x half> %cvt1382}1383 1384define float @assume_intersection_not_zero_and_not_nan(float %arg) {1385; CHECK-LABEL: define float @assume_intersection_not_zero_and_not_nan1386; CHECK-SAME: (float returned [[ARG:%.*]]) {1387; CHECK-NEXT:  entry:1388; CHECK-NEXT:    [[IS_NOT_ZERO_OR_NAN:%.*]] = fcmp une float [[ARG]], 0.000000e+001389; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[IS_NOT_ZERO_OR_NAN]]) #[[ATTR18]]1390; CHECK-NEXT:    [[IS_ORD:%.*]] = fcmp ord float [[ARG]], 0.000000e+001391; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[IS_ORD]]) #[[ATTR18]]1392; CHECK-NEXT:    call void @extern.use(float [[ARG]])1393; CHECK-NEXT:    ret float [[ARG]]1394;1395entry:1396  %is.not.zero.or.nan = fcmp une float %arg, 0.01397  call void @llvm.assume(i1 %is.not.zero.or.nan)1398  %is.ord = fcmp ord float %arg, 0.01399  call void @llvm.assume(i1 %is.ord)1400  call void @extern.use(float %arg)1401  ret float %arg1402}1403 1404define float @assume_intersection_class(float %arg) {1405; CHECK-LABEL: define float @assume_intersection_class1406; CHECK-SAME: (float returned [[ARG:%.*]]) {1407; CHECK-NEXT:  entry:1408; CHECK-NEXT:    [[POS_NORMAL_OR_POS_SUBNORMAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG]], i32 noundef 384) #[[ATTR20]]1409; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[POS_NORMAL_OR_POS_SUBNORMAL]]) #[[ATTR18]]1410; CHECK-NEXT:    [[IS_NORMAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG]], i32 noundef 264) #[[ATTR20]]1411; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[IS_NORMAL]]) #[[ATTR18]]1412; CHECK-NEXT:    call void @extern.use(float [[ARG]])1413; CHECK-NEXT:    ret float [[ARG]]1414;1415entry:1416  %pos.normal.or.pos.subnormal = call i1 @llvm.is.fpclass.f32(float %arg, i32 384)1417  call void @llvm.assume(i1 %pos.normal.or.pos.subnormal)1418  %is.normal = call i1 @llvm.is.fpclass.f32(float %arg, i32 264)1419  call void @llvm.assume(i1 %is.normal)1420 1421  call void @extern.use(float %arg)1422  ret float %arg1423}1424 1425define float @assume_intersection_none(float %arg) {1426; CHECK-LABEL: define float @assume_intersection_none1427; CHECK-SAME: (float returned [[ARG:%.*]]) {1428; CHECK-NEXT:  entry:1429; CHECK-NEXT:    [[CLASS1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG]], i32 noundef 682) #[[ATTR20]]1430; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[CLASS1]]) #[[ATTR18]]1431; CHECK-NEXT:    [[CLASS2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG]], i32 noundef 341) #[[ATTR20]]1432; CHECK-NEXT:    call void @llvm.assume(i1 noundef [[CLASS2]]) #[[ATTR18]]1433; CHECK-NEXT:    call void @extern.use(float [[ARG]])1434; CHECK-NEXT:    ret float [[ARG]]1435;1436entry:1437  %class1 = call i1 @llvm.is.fpclass.f32(float %arg, i32 682)1438  call void @llvm.assume(i1 %class1)1439  %class2 = call i1 @llvm.is.fpclass.f32(float %arg, i32 341)1440  call void @llvm.assume(i1 %class2)1441  call void @extern.use(float %arg)1442  ret float %arg1443}1444 1445define float @returned_extractelement_dynamic_index(<4 x float> nofpclass(nan) %vec, i32 %idx) {1446; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1447; CHECK-LABEL: define nofpclass(nan) float @returned_extractelement_dynamic_index1448; CHECK-SAME: (<4 x float> nofpclass(nan) [[VEC:%.*]], i32 [[IDX:%.*]]) #[[ATTR3]] {1449; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[VEC]], i32 [[IDX]]1450; CHECK-NEXT:    ret float [[EXTRACT]]1451;1452  %extract = extractelement <4 x float> %vec, i32 %idx1453  ret float %extract1454}1455 1456define float @returned_extractelement_index0(<4 x float> nofpclass(nan) %vec) {1457; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1458; CHECK-LABEL: define nofpclass(nan) float @returned_extractelement_index01459; CHECK-SAME: (<4 x float> nofpclass(nan) [[VEC:%.*]]) #[[ATTR3]] {1460; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[VEC]], i32 01461; CHECK-NEXT:    ret float [[EXTRACT]]1462;1463  %extract = extractelement <4 x float> %vec, i32 01464  ret float %extract1465}1466 1467define float @returned_extractelement_index_oob(<4 x float> nofpclass(nan) %vec) {1468; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1469; CHECK-LABEL: define nofpclass(nan) float @returned_extractelement_index_oob1470; CHECK-SAME: (<4 x float> nofpclass(nan) [[VEC:%.*]]) #[[ATTR3]] {1471; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[VEC]], i32 51472; CHECK-NEXT:    ret float [[EXTRACT]]1473;1474  %extract = extractelement <4 x float> %vec, i32 51475  ret float %extract1476}1477 1478define float @returned_extractelement_scalable(<vscale x 4 x float> nofpclass(nan) %vec) {1479; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1480; CHECK-LABEL: define nofpclass(nan) float @returned_extractelement_scalable1481; CHECK-SAME: (<vscale x 4 x float> nofpclass(nan) [[VEC:%.*]]) #[[ATTR3]] {1482; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <vscale x 4 x float> [[VEC]], i32 01483; CHECK-NEXT:    ret float [[EXTRACT]]1484;1485  %extract = extractelement <vscale x 4 x float> %vec, i32 01486  ret float %extract1487}1488 1489define float @returned_extractvalue([4 x float] nofpclass(nan) %array) {1490; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1491; CHECK-LABEL: define nofpclass(nan) float @returned_extractvalue1492; CHECK-SAME: ([4 x float] nofpclass(nan) [[ARRAY:%.*]]) #[[ATTR3]] {1493; CHECK-NEXT:    [[EXTRACT:%.*]] = extractvalue [4 x float] [[ARRAY]], 01494; CHECK-NEXT:    ret float [[EXTRACT]]1495;1496  %extract = extractvalue [4 x float] %array, 01497  ret float %extract1498}1499 1500define float @return_nofpclass_freeze_nan_arg(float nofpclass(nan) %arg) {1501; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1502; CHECK-LABEL: define noundef float @return_nofpclass_freeze_nan_arg1503; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR3]] {1504; CHECK-NEXT:    [[FREEZE:%.*]] = freeze float [[ARG]]1505; CHECK-NEXT:    ret float [[FREEZE]]1506;1507  %freeze = freeze float %arg1508  ret float %freeze1509}1510 1511define float @return_nofpclass_extractelement_freeze_pinf_arg(<2 x float> nofpclass(pinf) %arg) {1512; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1513; CHECK-LABEL: define noundef float @return_nofpclass_extractelement_freeze_pinf_arg1514; CHECK-SAME: (<2 x float> nofpclass(pinf) [[ARG:%.*]]) #[[ATTR3]] {1515; CHECK-NEXT:    [[FREEZE:%.*]] = freeze <2 x float> [[ARG]]1516; CHECK-NEXT:    [[ELT:%.*]] = extractelement <2 x float> [[FREEZE]], i32 01517; CHECK-NEXT:    ret float [[ELT]]1518;1519  %freeze = freeze <2 x float> %arg1520  %elt = extractelement <2 x float> %freeze, i32 01521  ret float %elt1522}1523 1524define <4 x float> @insertelement_constant_chain() {1525; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1526; CHECK-LABEL: define nofpclass(nan ninf nzero sub) <4 x float> @insertelement_constant_chain1527; CHECK-SAME: () #[[ATTR3]] {1528; CHECK-NEXT:    [[INS_0:%.*]] = insertelement <4 x float> poison, float 1.000000e+00, i32 01529; CHECK-NEXT:    [[INS_1:%.*]] = insertelement <4 x float> [[INS_0]], float 0.000000e+00, i32 11530; CHECK-NEXT:    [[INS_2:%.*]] = insertelement <4 x float> [[INS_1]], float -9.000000e+00, i32 21531; CHECK-NEXT:    [[INS_3:%.*]] = insertelement <4 x float> [[INS_2]], float 0x7FF0000000000000, i32 31532; CHECK-NEXT:    ret <4 x float> [[INS_3]]1533;1534  %ins.0 = insertelement <4 x float> poison, float 1.0, i32 01535  %ins.1 = insertelement <4 x float> %ins.0, float 0.0, i32 11536  %ins.2 = insertelement <4 x float> %ins.1, float -9.0, i32 21537  %ins.3 = insertelement <4 x float> %ins.2, float 0x7FF0000000000000, i32 31538  ret <4 x float> %ins.31539}1540 1541define <4 x float> @insertelement_non_constant_chain(i32 %idx) {1542; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1543; CHECK-LABEL: define nofpclass(nan inf nzero sub) <4 x float> @insertelement_non_constant_chain1544; CHECK-SAME: (i32 [[IDX:%.*]]) #[[ATTR3]] {1545; CHECK-NEXT:    [[INS_0:%.*]] = insertelement <4 x float> poison, float 1.000000e+00, i32 01546; CHECK-NEXT:    [[INS_1:%.*]] = insertelement <4 x float> [[INS_0]], float 0.000000e+00, i32 11547; CHECK-NEXT:    [[INS_2:%.*]] = insertelement <4 x float> [[INS_1]], float -9.000000e+00, i32 21548; CHECK-NEXT:    [[INS_3:%.*]] = insertelement <4 x float> [[INS_2]], float 3.000000e+00, i32 31549; CHECK-NEXT:    [[INS_4:%.*]] = insertelement <4 x float> [[INS_2]], float 4.000000e+00, i32 [[IDX]]1550; CHECK-NEXT:    ret <4 x float> [[INS_4]]1551;1552  %ins.0 = insertelement <4 x float> poison, float 1.0, i32 01553  %ins.1 = insertelement <4 x float> %ins.0, float 0.0, i32 11554  %ins.2 = insertelement <4 x float> %ins.1, float -9.0, i32 21555  %ins.3 = insertelement <4 x float> %ins.2, float 3.0, i32 31556  %ins.4 = insertelement <4 x float> %ins.2, float 4.0, i32 %idx1557  ret <4 x float> %ins.41558}1559 1560define <vscale x 4 x float> @insertelement_scalable_constant_chain() {1561; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1562; CHECK-LABEL: define <vscale x 4 x float> @insertelement_scalable_constant_chain1563; CHECK-SAME: () #[[ATTR3]] {1564; CHECK-NEXT:    [[INS_0:%.*]] = insertelement <vscale x 4 x float> poison, float 1.000000e+00, i32 01565; CHECK-NEXT:    [[INS_1:%.*]] = insertelement <vscale x 4 x float> [[INS_0]], float 0.000000e+00, i32 11566; CHECK-NEXT:    [[INS_2:%.*]] = insertelement <vscale x 4 x float> [[INS_1]], float -9.000000e+00, i32 21567; CHECK-NEXT:    [[INS_3:%.*]] = insertelement <vscale x 4 x float> [[INS_2]], float 0x7FF0000000000000, i32 31568; CHECK-NEXT:    ret <vscale x 4 x float> [[INS_3]]1569;1570  %ins.0 = insertelement <vscale x 4 x float> poison, float 1.0, i32 01571  %ins.1 = insertelement <vscale x 4 x float> %ins.0, float 0.0, i32 11572  %ins.2 = insertelement <vscale x 4 x float> %ins.1, float -9.0, i32 21573  %ins.3 = insertelement <vscale x 4 x float> %ins.2, float 0x7FF0000000000000, i32 31574  ret <vscale x 4 x float> %ins.31575}1576 1577define <4 x float> @insertelement_unknown_base(<4 x float> %arg0) {1578; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1579; CHECK-LABEL: define <4 x float> @insertelement_unknown_base1580; CHECK-SAME: (<4 x float> [[ARG0:%.*]]) #[[ATTR3]] {1581; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 11582; CHECK-NEXT:    ret <4 x float> [[INSERT]]1583;1584  %insert = insertelement <4 x float> %arg0, float 0.0, i32 11585  ret <4 x float> %insert1586}1587 1588define float @insertelement_extractelement_same(<4 x float> %arg0) {1589; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1590; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) float @insertelement_extractelement_same1591; CHECK-SAME: (<4 x float> [[ARG0:%.*]]) #[[ATTR3]] {1592; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 11593; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[INSERT]], i32 11594; CHECK-NEXT:    ret float [[EXTRACT]]1595;1596  %insert = insertelement <4 x float> %arg0, float 0.0, i32 11597  %extract = extractelement <4 x float> %insert, i32 11598  ret float %extract1599}1600 1601define float @insertelement_extractelement_different(<4 x float> nofpclass(zero) %arg0) {1602; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1603; CHECK-LABEL: define nofpclass(zero) float @insertelement_extractelement_different1604; CHECK-SAME: (<4 x float> nofpclass(zero) [[ARG0:%.*]]) #[[ATTR3]] {1605; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 11606; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[INSERT]], i32 21607; CHECK-NEXT:    ret float [[EXTRACT]]1608;1609  %insert = insertelement <4 x float> %arg0, float 0.0, i32 11610  %extract = extractelement <4 x float> %insert, i32 21611  ret float %extract1612}1613 1614define float @insertelement_extractelement_unknown(<4 x float> nofpclass(zero) %arg0, i32 %idx) {1615; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1616; CHECK-LABEL: define nofpclass(nzero) float @insertelement_extractelement_unknown1617; CHECK-SAME: (<4 x float> nofpclass(zero) [[ARG0:%.*]], i32 [[IDX:%.*]]) #[[ATTR3]] {1618; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 11619; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[INSERT]], i32 [[IDX]]1620; CHECK-NEXT:    ret float [[EXTRACT]]1621;1622  %insert = insertelement <4 x float> %arg0, float 0.0, i32 11623  %extract = extractelement <4 x float> %insert, i32 %idx1624  ret float %extract1625}1626 1627define <4 x float> @insertelement_index_oob_chain() {1628; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1629; CHECK-LABEL: define nofpclass(nan ninf nzero sub norm) <4 x float> @insertelement_index_oob_chain1630; CHECK-SAME: () #[[ATTR3]] {1631; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x float> zeroinitializer, float 0x7FF0000000000000, i32 41632; CHECK-NEXT:    ret <4 x float> [[INSERT]]1633;1634  %insert = insertelement <4 x float> zeroinitializer, float 0x7FF0000000000000, i32 41635  ret <4 x float> %insert1636}1637 1638define <2 x float> @multiple_extractelement(<4 x float> nofpclass(zero) %arg0) {1639; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1640; CHECK-LABEL: define nofpclass(zero) <2 x float> @multiple_extractelement1641; CHECK-SAME: (<4 x float> nofpclass(zero) [[ARG0:%.*]]) #[[ATTR3]] {1642; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 11643; CHECK-NEXT:    [[EXTRACT2:%.*]] = extractelement <4 x float> [[INSERT]], i32 21644; CHECK-NEXT:    [[EXTRACT3:%.*]] = extractelement <4 x float> [[INSERT]], i32 31645; CHECK-NEXT:    [[INS_0:%.*]] = insertelement <2 x float> poison, float [[EXTRACT3]], i32 01646; CHECK-NEXT:    [[INS_1:%.*]] = insertelement <2 x float> [[INS_0]], float [[EXTRACT2]], i32 11647; CHECK-NEXT:    ret <2 x float> [[INS_1]]1648;1649  %insert = insertelement <4 x float> %arg0, float 0.0, i32 11650  %extract2 = extractelement <4 x float> %insert, i32 21651  %extract3 = extractelement <4 x float> %insert, i32 31652  %ins.0 = insertelement <2 x float> poison, float %extract3, i32 01653  %ins.1 = insertelement <2 x float> %ins.0, float %extract2, i32 11654  ret <2 x float> %ins.11655}1656 1657; FIXME: Doesn't actually reach computeKnownFPClass1658define <4 x float> @shufflevector_constexpr() {1659; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1660; CHECK-LABEL: define <4 x float> @shufflevector_constexpr1661; CHECK-SAME: () #[[ATTR3]] {1662; CHECK-NEXT:    ret <4 x float> <float 1.000000e+00, float bitcast (i32 ptrtoint (ptr @shufflevector_constexpr to i32) to float), float 4.000000e+00, float 0.000000e+00>1663;1664  ret <4 x float> shufflevector (<2 x float> <float 1.0, float bitcast (i32 ptrtoint (ptr @shufflevector_constexpr to i32) to float)>, <2 x float> <float 4.0, float 0.0>, <4 x i32> <i32 0, i32 1, i32 2, i32 3>)1665}1666 1667define <4 x float> @shufflevector_concat_disjoint(<2 x float> nofpclass(nan) %arg0, <2 x float> nofpclass(inf) %arg1) {1668; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1669; CHECK-LABEL: define <4 x float> @shufflevector_concat_disjoint1670; CHECK-SAME: (<2 x float> nofpclass(nan) [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1671; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>1672; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1673;1674  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1675  ret <4 x float> %shuffle1676}1677 1678define <4 x float> @shufflevector_concat_overlap(<2 x float> nofpclass(nan norm psub) %arg0, <2 x float> nofpclass(inf nan sub) %arg1) {1679; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1680; CHECK-LABEL: define nofpclass(nan psub) <4 x float> @shufflevector_concat_overlap1681; CHECK-SAME: (<2 x float> nofpclass(nan psub norm) [[ARG0:%.*]], <2 x float> nofpclass(nan inf sub) [[ARG1:%.*]]) #[[ATTR3]] {1682; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>1683; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1684;1685  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1686  ret <4 x float> %shuffle1687}1688 1689define <4 x float> @shufflevector_unknown_lhs(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) {1690; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1691; CHECK-LABEL: define <4 x float> @shufflevector_unknown_lhs1692; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1693; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 3, i32 2, i32 1, i32 0>1694; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1695;1696  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 3, i32 2, i32 1, i32 0>1697  ret <4 x float> %shuffle1698}1699 1700define <4 x float> @shufflevector_unknown_rhs(<2 x float> nofpclass(inf) %arg0, <2 x float> %arg1) {1701; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1702; CHECK-LABEL: define <4 x float> @shufflevector_unknown_rhs1703; CHECK-SAME: (<2 x float> nofpclass(inf) [[ARG0:%.*]], <2 x float> [[ARG1:%.*]]) #[[ATTR3]] {1704; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 3, i32 2, i32 1, i32 0>1705; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1706;1707  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 3, i32 2, i32 1, i32 0>1708  ret <4 x float> %shuffle1709}1710 1711define <4 x float> @shufflevector_unknown_all(<2 x float> %arg0, <2 x float> %arg1) {1712; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1713; CHECK-LABEL: define <4 x float> @shufflevector_unknown_all1714; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> [[ARG1:%.*]]) #[[ATTR3]] {1715; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 3, i32 2, i32 1, i32 0>1716; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1717;1718  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 3, i32 2, i32 1, i32 0>1719  ret <4 x float> %shuffle1720}1721 1722define <4 x float> @shufflevector_only_demand_lhs(<2 x float> nofpclass(inf) %arg0, <2 x float> %arg1) {1723; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1724; CHECK-LABEL: define nofpclass(inf) <4 x float> @shufflevector_only_demand_lhs1725; CHECK-SAME: (<2 x float> nofpclass(inf) [[ARG0:%.*]], <2 x float> [[ARG1:%.*]]) #[[ATTR3]] {1726; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 0, i32 1, i32 1, i32 0>1727; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1728;1729  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 0, i32 1, i32 1, i32 0>1730  ret <4 x float> %shuffle1731}1732 1733define <4 x float> @shufflevector_only_demand_rhs(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) {1734; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1735; CHECK-LABEL: define nofpclass(inf) <4 x float> @shufflevector_only_demand_rhs1736; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1737; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 2, i32 3, i32 3, i32 2>1738; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1739;1740  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 2, i32 3, i32 3, i32 2>1741  ret <4 x float> %shuffle1742}1743 1744define <4 x float> @shufflevector_undef_demanded(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) {1745; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1746; CHECK-LABEL: define <4 x float> @shufflevector_undef_demanded1747; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1748; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> poison1749; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1750;1751  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> undef1752  ret <4 x float> %shuffle1753}1754 1755define <4 x float> @shufflevector_zeroinit_demanded(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) {1756; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1757; CHECK-LABEL: define <4 x float> @shufflevector_zeroinit_demanded1758; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1759; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> zeroinitializer1760; CHECK-NEXT:    ret <4 x float> [[SHUFFLE]]1761;1762  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> zeroinitializer1763  ret <4 x float> %shuffle1764}1765 1766define float @shufflevector_extractelt0(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) {1767; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1768; CHECK-LABEL: define float @shufflevector_extractelt01769; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1770; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 1, i32 3, i32 0, i32 1>1771; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[SHUFFLE]], i32 01772; CHECK-NEXT:    ret float [[EXTRACT]]1773;1774  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 1, i32 3, i32 0, i32 1>1775  %extract = extractelement <4 x float> %shuffle, i32 01776  ret float %extract1777}1778 1779define float @shufflevector_extractelt1(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) {1780; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1781; CHECK-LABEL: define nofpclass(inf) float @shufflevector_extractelt11782; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1783; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 1, i32 3, i32 0, i32 1>1784; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[SHUFFLE]], i32 11785; CHECK-NEXT:    ret float [[EXTRACT]]1786;1787  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 1, i32 3, i32 0, i32 1>1788  %extract = extractelement <4 x float> %shuffle, i32 11789  ret float %extract1790}1791 1792define float @shufflevector_extractelt2(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) {1793; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1794; CHECK-LABEL: define float @shufflevector_extractelt21795; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1796; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 1, i32 3, i32 0, i32 1>1797; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[SHUFFLE]], i32 21798; CHECK-NEXT:    ret float [[EXTRACT]]1799;1800  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 1, i32 3, i32 0, i32 1>1801  %extract = extractelement <4 x float> %shuffle, i32 21802  ret float %extract1803}1804 1805define float @shufflevector_extractelt3(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) {1806; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1807; CHECK-LABEL: define float @shufflevector_extractelt31808; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR3]] {1809; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> <i32 1, i32 3, i32 0, i32 1>1810; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <4 x float> [[SHUFFLE]], i32 31811; CHECK-NEXT:    ret float [[EXTRACT]]1812;1813  %shuffle = shufflevector <2 x float> %arg0, <2 x float> %arg1, <4 x i32> <i32 1, i32 3, i32 0, i32 1>1814  %extract = extractelement <4 x float> %shuffle, i32 31815  ret float %extract1816}1817 1818define float @shufflevector_constantdatavector_demanded0() {1819; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1820; CHECK-LABEL: define nofpclass(nan inf zero sub nnorm) float @shufflevector_constantdatavector_demanded01821; CHECK-SAME: () #[[ATTR3]] {1822; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <3 x float> <float 1.000000e+00, float 0x7FF8000000000000, float 0.000000e+00>, <3 x float> poison, <2 x i32> <i32 0, i32 2>1823; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <2 x float> [[SHUFFLE]], i32 01824; CHECK-NEXT:    ret float [[EXTRACT]]1825;1826  %shuffle = shufflevector <3 x float> <float 1.0, float 0x7FF8000000000000, float 0.0>, <3 x float> poison, <2 x i32> <i32 0, i32 2>1827  %extract = extractelement <2 x float> %shuffle, i32 01828  ret float %extract1829}1830 1831define float @shufflevector_constantdatavector_demanded1() {1832; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1833; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) float @shufflevector_constantdatavector_demanded11834; CHECK-SAME: () #[[ATTR3]] {1835; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <3 x float> <float 1.000000e+00, float 0x7FF8000000000000, float 0.000000e+00>, <3 x float> poison, <2 x i32> <i32 0, i32 2>1836; CHECK-NEXT:    [[EXTRACT:%.*]] = extractelement <2 x float> [[SHUFFLE]], i32 11837; CHECK-NEXT:    ret float [[EXTRACT]]1838;1839  %shuffle = shufflevector <3 x float> <float 1.0, float 0x7FF8000000000000, float 0.0>, <3 x float> poison, <2 x i32> <i32 0, i32 2>1840  %extract = extractelement <2 x float> %shuffle, i32 11841  ret float %extract1842}1843 1844define i32 @fptosi(float nofpclass(inf nan) %arg) {1845; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1846; CHECK-LABEL: define i32 @fptosi1847; CHECK-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR3]] {1848; CHECK-NEXT:    [[FPTOSI:%.*]] = fptosi float [[ARG]] to i321849; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[FPTOSI]], 11850; CHECK-NEXT:    ret i32 [[ADD]]1851;1852  %fptosi = fptosi float %arg to i321853  %add = add i32 %fptosi, 11854  ret i32 %add1855}1856 1857define float @fptrunc(double nofpclass(inf nan) %arg) {1858; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1859; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @fptrunc1860; CHECK-SAME: (double nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR3]] {1861; CHECK-NEXT:    [[CAST:%.*]] = fptrunc double [[ARG]] to float1862; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[CAST]], [[CAST]]1863; CHECK-NEXT:    ret float [[MUL]]1864;1865  %cast = fptrunc double %arg to float1866  %mul = fmul float %cast, %cast1867  ret float %mul1868}1869 1870define double @fpext(float nofpclass(inf nan) %arg) {1871; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1872; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) double @fpext1873; CHECK-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR3]] {1874; CHECK-NEXT:    [[CAST:%.*]] = fpext float [[ARG]] to double1875; CHECK-NEXT:    [[MUL:%.*]] = fmul double [[CAST]], [[CAST]]1876; CHECK-NEXT:    ret double [[MUL]]1877;1878  %cast = fpext float %arg to double1879  %mul = fmul double %cast, %cast1880  ret double %mul1881}1882 1883define float @atomicrmw_fadd(ptr %ptr, float nofpclass(inf nan) %val) {1884; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)1885; CHECK-LABEL: define float @atomicrmw_fadd1886; CHECK-SAME: (ptr nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[PTR:%.*]], float nofpclass(nan inf) [[VAL:%.*]]) #[[ATTR6:[0-9]+]] {1887; CHECK-NEXT:    [[RESULT:%.*]] = atomicrmw fadd ptr [[PTR]], float [[VAL]] seq_cst, align 41888; CHECK-NEXT:    ret float [[RESULT]]1889;1890  %result = atomicrmw fadd ptr %ptr, float %val seq_cst1891  ret float %result1892}1893 1894define float @load(ptr %ptr, float nofpclass(nan inf) %val) {1895; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)1896; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @load1897; CHECK-SAME: (ptr nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[PTR:%.*]], float nofpclass(nan inf) [[VAL:%.*]]) #[[ATTR7:[0-9]+]] {1898; CHECK-NEXT:    store float [[VAL]], ptr [[PTR]], align 41899; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[PTR]], align 41900; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[LOAD]], [[LOAD]]1901; CHECK-NEXT:    ret float [[MUL]]1902;1903  store float %val, ptr %ptr1904  %load = load float, ptr %ptr1905  %mul = fmul float %load, %load1906  ret float %mul1907}1908 1909define float @load_atomic(ptr %ptr, float nofpclass(nan inf) %val) {1910; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)1911; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @load_atomic1912; CHECK-SAME: (ptr nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[PTR:%.*]], float nofpclass(nan inf) [[VAL:%.*]]) #[[ATTR6]] {1913; CHECK-NEXT:    store atomic float [[VAL]], ptr [[PTR]] seq_cst, align 41914; CHECK-NEXT:    [[LOAD:%.*]] = load atomic float, ptr [[PTR]] seq_cst, align 41915; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[LOAD]], [[LOAD]]1916; CHECK-NEXT:    ret float [[MUL]]1917;1918  store atomic float %val, ptr %ptr seq_cst, align 41919  %load = load atomic float, ptr %ptr seq_cst, align 41920  %mul = fmul float %load, %load1921  ret float %mul1922}1923 1924define <8 x float> @shufflevector_shufflevector(<4 x float> nofpclass(inf nan) %arg0, <4 x float> nofpclass(inf nan zero) %arg1) {1925; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1926; CHECK-LABEL: define nofpclass(nan inf) <8 x float> @shufflevector_shufflevector1927; CHECK-SAME: (<4 x float> nofpclass(nan inf) [[ARG0:%.*]], <4 x float> nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR3]] {1928; CHECK-NEXT:    [[SHUFFLE0:%.*]] = shufflevector <4 x float> [[ARG0]], <4 x float> [[ARG0]], <4 x i32> <i32 3, i32 2, i32 1, i32 0>1929; CHECK-NEXT:    [[SHUFFLE1:%.*]] = shufflevector <4 x float> [[ARG1]], <4 x float> [[ARG1]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>1930; CHECK-NEXT:    [[SHUFFLE2:%.*]] = shufflevector <4 x float> [[SHUFFLE0]], <4 x float> [[SHUFFLE1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1931; CHECK-NEXT:    ret <8 x float> [[SHUFFLE2]]1932;1933  %shuffle0 = shufflevector <4 x float> %arg0, <4 x float> %arg0, <4 x i32> <i32 3, i32 2, i32 1, i32 0>1934  %shuffle1 = shufflevector <4 x float> %arg1, <4 x float> %arg1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1935  %shuffle2 = shufflevector <4 x float> %shuffle0, <4 x float> %shuffle1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1936  ret <8 x float> %shuffle21937}1938 1939define float @constrained_sitofp(i32 %arg) strictfp {1940; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind strictfp willreturn memory(inaccessiblemem: readwrite)1941; CHECK-LABEL: define nofpclass(nan nzero sub) float @constrained_sitofp1942; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR8:[0-9]+]] {1943; CHECK-NEXT:    [[VAL:%.*]] = call nofpclass(nan nzero sub) float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR20]]1944; CHECK-NEXT:    ret float [[VAL]]1945;1946  %val = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %arg, metadata !"round.dynamic", metadata !"fpexcept.strict")1947  ret float %val1948}1949 1950define float @constrained_uitofp(i32 %arg) strictfp {1951; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind strictfp willreturn memory(inaccessiblemem: readwrite)1952; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) float @constrained_uitofp1953; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR8]] {1954; CHECK-NEXT:    [[VAL:%.*]] = call nofpclass(nan ninf nzero sub nnorm) float @llvm.experimental.constrained.uitofp.f32.i32(i32 [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR20]]1955; CHECK-NEXT:    ret float [[VAL]]1956;1957  %val = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %arg, metadata !"round.dynamic", metadata !"fpexcept.strict")1958  ret float %val1959}1960 1961define float @fadd_p0(float %arg0) {1962; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1963; CHECK-LABEL: define nofpclass(nzero) float @fadd_p01964; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR3]] {1965; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], 0.000000e+001966; CHECK-NEXT:    ret float [[ADD]]1967;1968  %add = fadd float %arg0, 0.01969  ret float %add1970}1971 1972define float @fadd_n0(float %arg0) {1973; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1974; CHECK-LABEL: define float @fadd_n01975; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR3]] {1976; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], -0.000000e+001977; CHECK-NEXT:    ret float [[ADD]]1978;1979  %add = fadd float %arg0, -0.01980  ret float %add1981}1982 1983define float @fsub_p0(float %arg0) {1984; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1985; CHECK-LABEL: define float @fsub_p01986; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR3]] {1987; CHECK-NEXT:    [[SUB:%.*]] = fsub float [[ARG0]], 0.000000e+001988; CHECK-NEXT:    ret float [[SUB]]1989;1990  %sub = fsub float %arg0, 0.01991  ret float %sub1992}1993 1994define float @fsub_n0(float %arg0) {1995; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)1996; CHECK-LABEL: define nofpclass(nzero) float @fsub_n01997; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR3]] {1998; CHECK-NEXT:    [[SUB:%.*]] = fsub float [[ARG0]], -0.000000e+001999; CHECK-NEXT:    ret float [[SUB]]2000;2001  %sub = fsub float %arg0, -0.02002  ret float %sub2003}2004 2005define float @fsub_p0_commute(float %arg0) {2006; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2007; CHECK-LABEL: define nofpclass(nzero) float @fsub_p0_commute2008; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR3]] {2009; CHECK-NEXT:    [[SUB:%.*]] = fsub float 0.000000e+00, [[ARG0]]2010; CHECK-NEXT:    ret float [[SUB]]2011;2012  %sub = fsub float 0.0, %arg02013  ret float %sub2014}2015 2016define float @fsub_n0_commute(float %arg0) {2017; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2018; CHECK-LABEL: define float @fsub_n0_commute2019; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR3]] {2020; CHECK-NEXT:    [[SUB:%.*]] = fsub float -0.000000e+00, [[ARG0]]2021; CHECK-NEXT:    ret float [[SUB]]2022;2023  %sub = fsub float -0.0, %arg02024  ret float %sub2025}2026 2027define float @fadd_p0_ftz_daz(float %arg0) #3 {2028; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2029; CHECK-LABEL: define nofpclass(nzero) float @fadd_p0_ftz_daz2030; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR9:[0-9]+]] {2031; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], 0.000000e+002032; CHECK-NEXT:    ret float [[ADD]]2033;2034  %add = fadd float %arg0, 0.02035  ret float %add2036}2037 2038define float @fadd_n0_ftz_daz(float %arg0) #0 {2039; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2040; CHECK-LABEL: define float @fadd_n0_ftz_daz2041; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR10:[0-9]+]] {2042; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], -0.000000e+002043; CHECK-NEXT:    ret float [[ADD]]2044;2045  %add = fadd float %arg0, -0.02046  ret float %add2047}2048 2049define float @fsub_p0_ftz_daz(float %arg0) #0 {2050; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2051; CHECK-LABEL: define float @fsub_p0_ftz_daz2052; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR10]] {2053; CHECK-NEXT:    [[SUB:%.*]] = fsub float [[ARG0]], 0.000000e+002054; CHECK-NEXT:    ret float [[SUB]]2055;2056  %sub = fsub float %arg0, 0.02057  ret float %sub2058}2059 2060define float @fsub_n0_ftz_daz(float %arg0) #0 {2061; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2062; CHECK-LABEL: define float @fsub_n0_ftz_daz2063; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR10]] {2064; CHECK-NEXT:    [[SUB:%.*]] = fsub float [[ARG0]], -0.000000e+002065; CHECK-NEXT:    ret float [[SUB]]2066;2067  %sub = fsub float %arg0, -0.02068  ret float %sub2069}2070 2071define float @fsub_p0_commute_ftz_daz(float %arg0) #0 {2072; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2073; CHECK-LABEL: define float @fsub_p0_commute_ftz_daz2074; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR10]] {2075; CHECK-NEXT:    [[SUB:%.*]] = fsub float 0.000000e+00, [[ARG0]]2076; CHECK-NEXT:    ret float [[SUB]]2077;2078  %sub = fsub float 0.0, %arg02079  ret float %sub2080}2081 2082define float @fsub_n0_commute_ftz_daz(float %arg0) #0 {2083; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2084; CHECK-LABEL: define float @fsub_n0_commute_ftz_daz2085; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR10]] {2086; CHECK-NEXT:    [[SUB:%.*]] = fsub float -0.000000e+00, [[ARG0]]2087; CHECK-NEXT:    ret float [[SUB]]2088;2089  %sub = fsub float -0.0, %arg02090  ret float %sub2091}2092 2093define float @fadd_p0_ieee_daz(float %arg0) #2 {2094; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2095; CHECK-LABEL: define nofpclass(nzero) float @fadd_p0_ieee_daz2096; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR11:[0-9]+]] {2097; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], 0.000000e+002098; CHECK-NEXT:    ret float [[ADD]]2099;2100  %add = fadd float %arg0, 0.02101  ret float %add2102}2103 2104define float @fadd_p0_dapz_ieee(float %arg0) #4 {2105; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2106; CHECK-LABEL: define nofpclass(nzero) float @fadd_p0_dapz_ieee2107; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR12:[0-9]+]] {2108; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], 0.000000e+002109; CHECK-NEXT:    ret float [[ADD]]2110;2111  %add = fadd float %arg0, 0.02112  ret float %add2113}2114 2115define float @fadd_n0_ieee_daz(float %arg0) #2 {2116; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2117; CHECK-LABEL: define float @fadd_n0_ieee_daz2118; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR11]] {2119; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], -0.000000e+002120; CHECK-NEXT:    ret float [[ADD]]2121;2122  %add = fadd float %arg0, -0.02123  ret float %add2124}2125 2126define float @fsub_p0_ieee_daz(float %arg0) #2 {2127; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2128; CHECK-LABEL: define float @fsub_p0_ieee_daz2129; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR11]] {2130; CHECK-NEXT:    [[SUB:%.*]] = fsub float [[ARG0]], 0.000000e+002131; CHECK-NEXT:    ret float [[SUB]]2132;2133  %sub = fsub float %arg0, 0.02134  ret float %sub2135}2136 2137define float @fsub_n0_ieee_daz(float %arg0) #2 {2138; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2139; CHECK-LABEL: define nofpclass(nzero) float @fsub_n0_ieee_daz2140; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR11]] {2141; CHECK-NEXT:    [[SUB:%.*]] = fsub float [[ARG0]], -0.000000e+002142; CHECK-NEXT:    ret float [[SUB]]2143;2144  %sub = fsub float %arg0, -0.02145  ret float %sub2146}2147 2148define float @fsub_p0_commute_ieee_daz(float %arg0) #2 {2149; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2150; CHECK-LABEL: define nofpclass(nzero) float @fsub_p0_commute_ieee_daz2151; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR11]] {2152; CHECK-NEXT:    [[SUB:%.*]] = fsub float 0.000000e+00, [[ARG0]]2153; CHECK-NEXT:    ret float [[SUB]]2154;2155  %sub = fsub float 0.0, %arg02156  ret float %sub2157}2158 2159define float @fsub_n0_commute_ieee_daz(float %arg0) #1 {2160; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2161; CHECK-LABEL: define float @fsub_n0_commute_ieee_daz2162; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR13:[0-9]+]] {2163; CHECK-NEXT:    [[SUB:%.*]] = fsub float -0.000000e+00, [[ARG0]]2164; CHECK-NEXT:    ret float [[SUB]]2165;2166  %sub = fsub float -0.0, %arg02167  ret float %sub2168}2169 2170define float @fadd_never_negzero_or_negsub(float nofpclass(nzero nsub) %a, float nofpclass(nzero nsub) %b) {2171; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2172; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_negsub2173; CHECK-SAME: (float nofpclass(nzero nsub) [[A:%.*]], float nofpclass(nzero nsub) [[B:%.*]]) #[[ATTR3]] {2174; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[A]], [[B]]2175; CHECK-NEXT:    ret float [[ADD]]2176;2177  %add = fadd float %a, %b2178  ret float %add2179}2180 2181define float @fadd_never_negzero_or_negsub_daz(float nofpclass(nzero nsub) %a, float nofpclass(nzero nsub) %b) #2 {2182; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2183; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_negsub_daz2184; CHECK-SAME: (float nofpclass(nzero nsub) [[A:%.*]], float nofpclass(nzero nsub) [[B:%.*]]) #[[ATTR11]] {2185; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[A]], [[B]]2186; CHECK-NEXT:    ret float [[ADD]]2187;2188  %add = fadd float %a, %b2189  ret float %add2190}2191 2192define float @fadd_never_negzero_or_negsub_dapz(float nofpclass(nzero nsub) %a, float nofpclass(nzero nsub) %b) #5 {2193; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2194; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_negsub_dapz2195; CHECK-SAME: (float nofpclass(nzero nsub) [[A:%.*]], float nofpclass(nzero nsub) [[B:%.*]]) #[[ATTR14:[0-9]+]] {2196; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[A]], [[B]]2197; CHECK-NEXT:    ret float [[ADD]]2198;2199  %add = fadd float %a, %b2200  ret float %add2201}2202 2203define float @fadd_never_negzero_or_possub(float nofpclass(nzero psub) %a, float nofpclass(nzero psub) %b) {2204; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2205; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_possub2206; CHECK-SAME: (float nofpclass(nzero psub) [[A:%.*]], float nofpclass(nzero psub) [[B:%.*]]) #[[ATTR3]] {2207; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[A]], [[B]]2208; CHECK-NEXT:    ret float [[ADD]]2209;2210  %add = fadd float %a, %b2211  ret float %add2212}2213 2214define float @fadd_never_negzero_or_possub_daz(float nofpclass(nzero psub) %a, float nofpclass(nzero psub) %b) #2 {2215; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2216; CHECK-LABEL: define float @fadd_never_negzero_or_possub_daz2217; CHECK-SAME: (float nofpclass(nzero psub) [[A:%.*]], float nofpclass(nzero psub) [[B:%.*]]) #[[ATTR11]] {2218; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[A]], [[B]]2219; CHECK-NEXT:    ret float [[ADD]]2220;2221  %add = fadd float %a, %b2222  ret float %add2223}2224 2225define float @fadd_never_negzero_or_possub_dapz(float nofpclass(nzero psub) %a, float nofpclass(nzero psub) %b) #5 {2226; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2227; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_possub_dapz2228; CHECK-SAME: (float nofpclass(nzero psub) [[A:%.*]], float nofpclass(nzero psub) [[B:%.*]]) #[[ATTR14]] {2229; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[A]], [[B]]2230; CHECK-NEXT:    ret float [[ADD]]2231;2232  %add = fadd float %a, %b2233  ret float %add2234}2235 2236define float @fadd_never_negzero_or_sub_daz(float nofpclass(nzero sub) %a, float nofpclass(nzero sub) %b) #2 {2237; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2238; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_sub_daz2239; CHECK-SAME: (float nofpclass(nzero sub) [[A:%.*]], float nofpclass(nzero sub) [[B:%.*]]) #[[ATTR11]] {2240; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[A]], [[B]]2241; CHECK-NEXT:    ret float [[ADD]]2242;2243  %add = fadd float %a, %b2244  ret float %add2245}2246 2247define float @fadd_never_negzero_or_sub_dapz(float nofpclass(nzero sub) %a, float nofpclass(nzero sub) %b) #5 {2248; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2249; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_sub_dapz2250; CHECK-SAME: (float nofpclass(nzero sub) [[A:%.*]], float nofpclass(nzero sub) [[B:%.*]]) #[[ATTR14]] {2251; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[A]], [[B]]2252; CHECK-NEXT:    ret float [[ADD]]2253;2254  %add = fadd float %a, %b2255  ret float %add2256}2257 2258define float @fadd_known_positive_lhs(float nofpclass(ninf nsub nnorm) %arg0, float %arg1) {2259; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2260; CHECK-LABEL: define float @fadd_known_positive_lhs2261; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR3]] {2262; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2263; CHECK-NEXT:    ret float [[ADD]]2264;2265  %add = fadd float %arg0, %arg12266  ret float %add2267}2268 2269define float @fadd_known_positive_rhs(float %arg0, float nofpclass(ninf nsub nnorm) %arg1) {2270; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2271; CHECK-LABEL: define float @fadd_known_positive_rhs2272; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR3]] {2273; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2274; CHECK-NEXT:    ret float [[ADD]]2275;2276  %add = fadd float %arg0, %arg12277  ret float %add2278}2279 2280define float @fadd_known_positive(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm) %arg1) {2281; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2282; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @fadd_known_positive2283; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR3]] {2284; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2285; CHECK-NEXT:    ret float [[ADD]]2286;2287  %add = fadd float %arg0, %arg12288  ret float %add2289}2290 2291define float @fadd_known_positive_daz(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm) %arg1) #0 {2292; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2293; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @fadd_known_positive_daz2294; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR10]] {2295; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2296; CHECK-NEXT:    ret float [[ADD]]2297;2298  %add = fadd float %arg0, %arg12299  ret float %add2300}2301 2302define float @fadd_known_positive_nzero_lhs(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm) %arg1) {2303; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2304; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @fadd_known_positive_nzero_lhs2305; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR3]] {2306; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2307; CHECK-NEXT:    ret float [[ADD]]2308;2309  %add = fadd float %arg0, %arg12310  ret float %add2311}2312 2313define float @fadd_known_positive_nzero_rhs(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) {2314; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2315; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @fadd_known_positive_nzero_rhs2316; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR3]] {2317; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2318; CHECK-NEXT:    ret float [[ADD]]2319;2320  %add = fadd float %arg0, %arg12321  ret float %add2322}2323 2324define float @fadd_known_positive_nzero(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) {2325; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2326; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @fadd_known_positive_nzero2327; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR3]] {2328; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2329; CHECK-NEXT:    ret float [[ADD]]2330;2331  %add = fadd float %arg0, %arg12332  ret float %add2333}2334 2335define float @fadd_known_positive_nzero_ftz_daz(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #0 {2336; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2337; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @fadd_known_positive_nzero_ftz_daz2338; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR10]] {2339; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2340; CHECK-NEXT:    ret float [[ADD]]2341;2342  %add = fadd float %arg0, %arg12343  ret float %add2344}2345 2346define float @fadd_known_positive_nzero_ftz(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #1 {2347; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2348; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @fadd_known_positive_nzero_ftz2349; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR13]] {2350; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2351; CHECK-NEXT:    ret float [[ADD]]2352;2353  %add = fadd float %arg0, %arg12354  ret float %add2355}2356 2357define float @fadd_known_positive_nzero_daz(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #2 {2358; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2359; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @fadd_known_positive_nzero_daz2360; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR11]] {2361; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2362; CHECK-NEXT:    ret float [[ADD]]2363;2364  %add = fadd float %arg0, %arg12365  ret float %add2366}2367 2368define float @fadd_known_positive_normal(float nofpclass(ninf nnorm nzero) %arg0, float nofpclass(ninf nnorm nzero) %arg1) {2369; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2370; CHECK-LABEL: define nofpclass(nzero) float @fadd_known_positive_normal2371; CHECK-SAME: (float nofpclass(ninf nzero nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nnorm) [[ARG1:%.*]]) #[[ATTR3]] {2372; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2373; CHECK-NEXT:    ret float [[ADD]]2374;2375  %add = fadd float %arg0, %arg12376  ret float %add2377}2378 2379define float @fadd_known_positive_normal_daz(float nofpclass(ninf nnorm nzero) %arg0, float nofpclass(ninf nnorm nzero) %arg1) #0 {2380; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2381; CHECK-LABEL: define float @fadd_known_positive_normal_daz2382; CHECK-SAME: (float nofpclass(ninf nzero nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nnorm) [[ARG1:%.*]]) #[[ATTR10]] {2383; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2384; CHECK-NEXT:    ret float [[ADD]]2385;2386  %add = fadd float %arg0, %arg12387  ret float %add2388}2389 2390define float @fadd_known_positive_normal_except0_daz(float nofpclass(ninf nnorm) %arg0, float nofpclass(ninf nnorm) %arg1) #0 {2391; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2392; CHECK-LABEL: define float @fadd_known_positive_normal_except0_daz2393; CHECK-SAME: (float nofpclass(ninf nnorm) [[ARG0:%.*]], float nofpclass(ninf nnorm) [[ARG1:%.*]]) #[[ATTR10]] {2394; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2395; CHECK-NEXT:    ret float [[ADD]]2396;2397  %add = fadd float %arg0, %arg12398  ret float %add2399}2400 2401define float @fadd_known_positive_normal_dapz(float nofpclass(ninf nnorm nzero) %arg0, float nofpclass(ninf nnorm nzero) %arg1) #3 {2402; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2403; CHECK-LABEL: define nofpclass(nzero) float @fadd_known_positive_normal_dapz2404; CHECK-SAME: (float nofpclass(ninf nzero nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nnorm) [[ARG1:%.*]]) #[[ATTR9]] {2405; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]]2406; CHECK-NEXT:    ret float [[ADD]]2407;2408  %add = fadd float %arg0, %arg12409  ret float %add2410}2411 2412define internal float @returns_fence(float %arg) {2413; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2414; TUNIT-LABEL: define internal float @returns_fence2415; TUNIT-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR3]] {2416; TUNIT-NEXT:    [[RET:%.*]] = call float @llvm.arithmetic.fence.f32(float nofpclass(inf) [[ARG]]) #[[ATTR22]]2417; TUNIT-NEXT:    ret float [[RET]]2418;2419; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2420; CGSCC-LABEL: define internal float @returns_fence2421; CGSCC-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR3]] {2422; CGSCC-NEXT:    [[RET:%.*]] = call float @llvm.arithmetic.fence.f32(float nofpclass(nan inf) [[ARG]]) #[[ATTR19]]2423; CGSCC-NEXT:    ret float [[RET]]2424;2425  %ret = call float @llvm.arithmetic.fence.f32(float %arg)2426  ret float %ret2427}2428 2429; Check that the func0 callsite is marked with both no inf and no nan2430define internal float @refine_callsite_attribute(float nofpclass(inf) %arg) {2431; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2432; TUNIT-LABEL: define internal float @refine_callsite_attribute2433; TUNIT-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR3]] {2434; TUNIT-NEXT:    [[FUNC0:%.*]] = call float @returns_fence(float nofpclass(nan inf) [[ARG]]) #[[ATTR19]]2435; TUNIT-NEXT:    [[RET:%.*]] = call float @llvm.arithmetic.fence.f32(float [[FUNC0]]) #[[ATTR22]]2436; TUNIT-NEXT:    ret float [[RET]]2437;2438; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)2439; CGSCC-LABEL: define internal float @refine_callsite_attribute2440; CGSCC-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR4]] {2441; CGSCC-NEXT:    [[FUNC0:%.*]] = call float @returns_fence(float nofpclass(nan inf) [[ARG]]) #[[ATTR19]]2442; CGSCC-NEXT:    [[RET:%.*]] = call float @llvm.arithmetic.fence.f32(float [[FUNC0]]) #[[ATTR19]]2443; CGSCC-NEXT:    ret float [[RET]]2444;2445  %func0 = call float @returns_fence(float nofpclass(nan) %arg)2446  %ret = call float @llvm.arithmetic.fence.f32(float %func0)2447  ret float %ret2448}2449 2450define float @user(float %arg) {2451; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2452; TUNIT-LABEL: define float @user2453; TUNIT-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR3]] {2454; TUNIT-NEXT:    [[FUNC1:%.*]] = call float @refine_callsite_attribute(float nofpclass(inf) [[ARG]]) #[[ATTR19]]2455; TUNIT-NEXT:    ret float [[FUNC1]]2456;2457; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)2458; CGSCC-LABEL: define float @user2459; CGSCC-SAME: (float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR4]] {2460; CGSCC-NEXT:    [[FUNC1:%.*]] = call float @refine_callsite_attribute(float nofpclass(nan inf) [[ARG]]) #[[ATTR19]]2461; CGSCC-NEXT:    ret float [[FUNC1]]2462;2463  %func1 = call float @refine_callsite_attribute(float %arg)2464  ret float %func12465}2466 2467; value is passed through memory2468define internal float @through_memory0(ptr %ptr.arg) {2469; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2470; CGSCC-LABEL: define internal float @through_memory02471; CGSCC-SAME: (float [[TMP0:%.*]]) #[[ATTR3]] {2472; CGSCC-NEXT:    [[PTR_ARG_PRIV:%.*]] = alloca float, align 42473; CGSCC-NEXT:    store float [[TMP0]], ptr [[PTR_ARG_PRIV]], align 42474; CGSCC-NEXT:    [[LOAD:%.*]] = load float, ptr [[PTR_ARG_PRIV]], align 4, !invariant.load [[META0:![0-9]+]]2475; CGSCC-NEXT:    ret float [[LOAD]]2476;2477  %load = load float, ptr %ptr.arg2478  ret float %load2479}2480 2481; value is passed through memory and goes through an inferrable FP user2482define internal float @through_memory1(ptr %ptr.arg) {2483; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2484; TUNIT-LABEL: define internal float @through_memory12485; TUNIT-SAME: (float [[TMP0:%.*]]) #[[ATTR3]] {2486; TUNIT-NEXT:    [[PTR_ARG_PRIV:%.*]] = alloca float, align 42487; TUNIT-NEXT:    store float [[TMP0]], ptr [[PTR_ARG_PRIV]], align 42488; TUNIT-NEXT:    [[LOAD:%.*]] = load float, ptr [[PTR_ARG_PRIV]], align 42489; TUNIT-NEXT:    [[CALL:%.*]] = call float @llvm.arithmetic.fence.f32(float [[LOAD]]) #[[ATTR22]]2490; TUNIT-NEXT:    ret float [[CALL]]2491;2492; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2493; CGSCC-LABEL: define internal float @through_memory12494; CGSCC-SAME: (float [[TMP0:%.*]]) #[[ATTR3]] {2495; CGSCC-NEXT:    [[PTR_ARG_PRIV:%.*]] = alloca float, align 42496; CGSCC-NEXT:    store float [[TMP0]], ptr [[PTR_ARG_PRIV]], align 42497; CGSCC-NEXT:    [[LOAD:%.*]] = load float, ptr [[PTR_ARG_PRIV]], align 4, !invariant.load [[META0]]2498; CGSCC-NEXT:    [[CALL:%.*]] = call float @llvm.arithmetic.fence.f32(float [[LOAD]]) #[[ATTR19]]2499; CGSCC-NEXT:    ret float [[CALL]]2500;2501  %load = load float, ptr %ptr.arg2502  %call = call float @llvm.arithmetic.fence.f32(float %load)2503  ret float %call2504}2505 2506; value is passed through memory and goes through an uninferrable FP user2507define internal float @through_memory2(ptr %ptr.arg) {2508; CHECK: Function Attrs: memory(readwrite, argmem: none)2509; CHECK-LABEL: define internal float @through_memory22510; CHECK-SAME: (float [[TMP0:%.*]]) #[[ATTR15:[0-9]+]] {2511; CHECK-NEXT:    [[PTR_ARG_PRIV:%.*]] = alloca float, align 42512; CHECK-NEXT:    store float [[TMP0]], ptr [[PTR_ARG_PRIV]], align 42513; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[PTR_ARG_PRIV]], align 4, !invariant.load [[META0:![0-9]+]]2514; CHECK-NEXT:    [[CALL:%.*]] = call float @extern.f32(float [[LOAD]])2515; CHECK-NEXT:    ret float [[CALL]]2516;2517  %load = load float, ptr %ptr.arg2518  %call = call float @extern.f32(float %load)2519  ret float %call2520}2521 2522define float @call_through_memory0(float nofpclass(nan) %val) {2523; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2524; TUNIT-LABEL: define nofpclass(nan) float @call_through_memory02525; TUNIT-SAME: (float returned nofpclass(nan) [[VAL:%.*]]) #[[ATTR3]] {2526; TUNIT-NEXT:    [[ALLOCA:%.*]] = alloca float, align 42527; TUNIT-NEXT:    store float [[VAL]], ptr [[ALLOCA]], align 42528; TUNIT-NEXT:    ret float [[VAL]]2529;2530; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)2531; CGSCC-LABEL: define float @call_through_memory02532; CGSCC-SAME: (float nofpclass(nan) [[VAL:%.*]]) #[[ATTR4]] {2533; CGSCC-NEXT:    [[ALLOCA:%.*]] = alloca float, align 42534; CGSCC-NEXT:    store float [[VAL]], ptr [[ALLOCA]], align 42535; CGSCC-NEXT:    [[THROUGH_MEMORY:%.*]] = call float @through_memory0(float nofpclass(nan) [[VAL]]) #[[ATTR19]]2536; CGSCC-NEXT:    ret float [[THROUGH_MEMORY]]2537;2538  %alloca = alloca float2539  store float %val, ptr %alloca2540  %through_memory = call float @through_memory0(ptr %alloca)2541  ret float %through_memory2542}2543 2544define float @call_through_memory1(float nofpclass(nan) %val) {2545; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2546; TUNIT-LABEL: define float @call_through_memory12547; TUNIT-SAME: (float nofpclass(nan) [[VAL:%.*]]) #[[ATTR3]] {2548; TUNIT-NEXT:    [[ALLOCA:%.*]] = alloca float, align 42549; TUNIT-NEXT:    store float [[VAL]], ptr [[ALLOCA]], align 42550; TUNIT-NEXT:    [[TMP1:%.*]] = load float, ptr [[ALLOCA]], align 42551; TUNIT-NEXT:    [[THROUGH_MEMORY:%.*]] = call float @through_memory1(float [[TMP1]]) #[[ATTR21]]2552; TUNIT-NEXT:    ret float [[THROUGH_MEMORY]]2553;2554; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)2555; CGSCC-LABEL: define float @call_through_memory12556; CGSCC-SAME: (float nofpclass(nan) [[VAL:%.*]]) #[[ATTR4]] {2557; CGSCC-NEXT:    [[ALLOCA:%.*]] = alloca float, align 42558; CGSCC-NEXT:    store float [[VAL]], ptr [[ALLOCA]], align 42559; CGSCC-NEXT:    [[THROUGH_MEMORY:%.*]] = call float @through_memory1(float nofpclass(nan) [[VAL]]) #[[ATTR19]]2560; CGSCC-NEXT:    ret float [[THROUGH_MEMORY]]2561;2562  %alloca = alloca float2563  store float %val, ptr %alloca2564  %through_memory = call float @through_memory1(ptr %alloca)2565  ret float %through_memory2566}2567 2568define float @call_through_memory2(float nofpclass(nan) %val) {2569; TUNIT-LABEL: define float @call_through_memory22570; TUNIT-SAME: (float nofpclass(nan) [[VAL:%.*]]) {2571; TUNIT-NEXT:    [[ALLOCA:%.*]] = alloca float, align 42572; TUNIT-NEXT:    store float [[VAL]], ptr [[ALLOCA]], align 42573; TUNIT-NEXT:    [[TMP1:%.*]] = load float, ptr [[ALLOCA]], align 42574; TUNIT-NEXT:    [[THROUGH_MEMORY:%.*]] = call float @through_memory2(float [[TMP1]])2575; TUNIT-NEXT:    ret float [[THROUGH_MEMORY]]2576;2577; CGSCC-LABEL: define float @call_through_memory22578; CGSCC-SAME: (float nofpclass(nan) [[VAL:%.*]]) {2579; CGSCC-NEXT:    [[ALLOCA:%.*]] = alloca float, align 42580; CGSCC-NEXT:    store float [[VAL]], ptr [[ALLOCA]], align 42581; CGSCC-NEXT:    [[THROUGH_MEMORY:%.*]] = call float @through_memory2(float nofpclass(nan) [[VAL]])2582; CGSCC-NEXT:    ret float [[THROUGH_MEMORY]]2583;2584  %alloca = alloca float2585  store float %val, ptr %alloca2586  %through_memory = call float @through_memory2(ptr %alloca)2587  ret float %through_memory2588}2589 2590define amdgpu_kernel void @fast_pow_kernel(ptr addrspace(1) nocapture noundef writeonly align 4 %out, ptr addrspace(1) nocapture noundef readonly align 4 %in1, ptr addrspace(1) nocapture noundef readonly align 4 %in2)  {2591; CHECK-LABEL: define amdgpu_kernel void @fast_pow_kernel2592; CHECK-SAME: (ptr addrspace(1) nofree noundef writeonly align 4 captures(none) [[OUT:%.*]], ptr addrspace(1) nofree noundef readonly align 4 captures(none) [[IN1:%.*]], ptr addrspace(1) nofree noundef readonly align 4 captures(none) [[IN2:%.*]]) {2593; CHECK-NEXT:  entry:2594; CHECK-NEXT:    [[CALL:%.*]] = tail call i64 @_Z13get_global_idj(i32 noundef 0)2595; CHECK-NEXT:    [[SEXT:%.*]] = shl i64 [[CALL]], 322596; CHECK-NEXT:    [[IDXPROM:%.*]] = ashr exact i64 [[SEXT]], 322597; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[IN1]], i64 [[IDXPROM]]2598; CHECK-NEXT:    [[I:%.*]] = load float, ptr addrspace(1) [[ARRAYIDX]], align 42599; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[IN2]], i64 [[IDXPROM]]2600; CHECK-NEXT:    [[I1:%.*]] = load float, ptr addrspace(1) [[ARRAYIDX2]], align 42601; CHECK-NEXT:    [[CALL3:%.*]] = tail call reassoc nnan ninf nsz arcp afn nofpclass(nan inf) float @pow_wrapper(float noundef nofpclass(nan inf) [[I]], float noundef nofpclass(nan inf) [[I1]])2602; CHECK-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[OUT]], i64 [[IDXPROM]]2603; CHECK-NEXT:    store float [[CALL3]], ptr addrspace(1) [[ARRAYIDX5]], align 42604; CHECK-NEXT:    ret void2605;2606entry:2607  %call = tail call i64 @_Z13get_global_idj(i32 noundef 0)2608  %sext = shl i64 %call, 322609  %idxprom = ashr exact i64 %sext, 322610  %arrayidx = getelementptr inbounds float, ptr addrspace(1) %in1, i64 %idxprom2611  %i = load float, ptr addrspace(1) %arrayidx, align 42612  %arrayidx2 = getelementptr inbounds float, ptr addrspace(1) %in2, i64 %idxprom2613  %i1 = load float, ptr addrspace(1) %arrayidx2, align 42614  %call3 = tail call reassoc nnan ninf nsz arcp afn nofpclass(nan inf) float @pow_wrapper(float noundef nofpclass(nan inf) %i, float noundef nofpclass(nan inf) %i1)2615  %arrayidx5 = getelementptr inbounds float, ptr addrspace(1) %out, i64 %idxprom2616  store float %call3, ptr addrspace(1) %arrayidx5, align 42617  ret void2618}2619 2620define internal float @pow_wrapper(float %arg, float %arg1) {2621; TUNIT: Function Attrs: norecurse2622; TUNIT-LABEL: define internal float @pow_wrapper2623; TUNIT-SAME: (float noundef nofpclass(nan inf) [[ARG:%.*]], float noundef nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR16:[0-9]+]] {2624; TUNIT-NEXT:  bb:2625; TUNIT-NEXT:    [[I:%.*]] = tail call float @pow_impl(float noundef nofpclass(nan inf) [[ARG]], float noundef nofpclass(nan inf) [[ARG1]])2626; TUNIT-NEXT:    ret float [[I]]2627;2628; CGSCC-LABEL: define internal float @pow_wrapper2629; CGSCC-SAME: (float noundef nofpclass(nan inf) [[ARG:%.*]], float noundef nofpclass(nan inf) [[ARG1:%.*]]) {2630; CGSCC-NEXT:  bb:2631; CGSCC-NEXT:    [[I:%.*]] = tail call float @pow_impl(float noundef nofpclass(nan inf) [[ARG]], float noundef nofpclass(nan inf) [[ARG1]])2632; CGSCC-NEXT:    ret float [[I]]2633;2634bb:2635  %i = tail call float @pow_impl(float %arg, float %arg1)2636  ret float %i2637}2638 2639; nofpclass(nan inf) should reach here through pow_wrapper2640define internal float @pow_impl(float %arg, float %arg1) {2641; TUNIT: Function Attrs: norecurse2642; TUNIT-LABEL: define internal float @pow_impl2643; TUNIT-SAME: (float noundef nofpclass(nan inf) [[ARG:%.*]], float noundef nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR16]] {2644; TUNIT-NEXT:  bb:2645; TUNIT-NEXT:    [[IMPLEMENT_POW:%.*]] = call float asm "2646; TUNIT-NEXT:    ret float [[IMPLEMENT_POW]]2647;2648; CGSCC: Function Attrs: norecurse2649; CGSCC-LABEL: define internal float @pow_impl2650; CGSCC-SAME: (float [[ARG:%.*]], float [[ARG1:%.*]]) #[[ATTR16:[0-9]+]] {2651; CGSCC-NEXT:  bb:2652; CGSCC-NEXT:    [[IMPLEMENT_POW:%.*]] = call float asm "2653; CGSCC-NEXT:    ret float [[IMPLEMENT_POW]]2654;2655bb:2656  %implement.pow = call float asm " ; do pow $0, $1, $2", "=v,v,v"(float %arg, float %arg1)2657  ret float %implement.pow2658}2659 2660define [4 x float] @constant_aggregate_zero() {2661; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2662; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) [4 x float] @constant_aggregate_zero2663; CHECK-SAME: () #[[ATTR3]] {2664; CHECK-NEXT:    ret [4 x float] zeroinitializer2665;2666  ret [4 x float] zeroinitializer2667}2668 2669define <vscale x 4 x float> @scalable_splat_pnorm() {2670; CHECK-CV: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2671; CHECK-CV-LABEL: define noundef <vscale x 4 x float> @scalable_splat_pnorm2672; CHECK-CV-SAME: () #[[ATTR3]] {2673; CHECK-CV-NEXT:    ret <vscale x 4 x float> splat (float 1.000000e+00)2674;2675; CHECK-CI: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2676; CHECK-CI-LABEL: define noundef nofpclass(nan inf zero sub nnorm) <vscale x 4 x float> @scalable_splat_pnorm2677; CHECK-CI-SAME: () #[[ATTR3]] {2678; CHECK-CI-NEXT:    ret <vscale x 4 x float> splat (float 1.000000e+00)2679;2680  ret <vscale x 4 x float> splat (float 1.0)2681}2682 2683define <vscale x 4 x float> @scalable_splat_zero() {2684; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2685; CHECK-LABEL: define noundef nofpclass(nan inf nzero sub norm) <vscale x 4 x float> @scalable_splat_zero2686; CHECK-SAME: () #[[ATTR3]] {2687; CHECK-NEXT:    ret <vscale x 4 x float> zeroinitializer2688;2689  ret <vscale x 4 x float> zeroinitializer2690}2691 2692; Verify we do not derive 'nofpclass(inf zero sub norm)' for the argument __x.2693; See https://github.com/llvm/llvm-project/issues/785072694 2695define double @call_abs(double noundef %__x) {2696; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2697; TUNIT-LABEL: define noundef nofpclass(ninf nzero nsub nnorm) double @call_abs2698; TUNIT-SAME: (double noundef [[__X:%.*]]) #[[ATTR3]] {2699; TUNIT-NEXT:  entry:2700; TUNIT-NEXT:    [[ABS:%.*]] = tail call noundef nofpclass(ninf nzero nsub nnorm) double @llvm.fabs.f64(double noundef [[__X]]) #[[ATTR22]]2701; TUNIT-NEXT:    ret double [[ABS]]2702;2703; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2704; CGSCC-LABEL: define noundef nofpclass(ninf nzero nsub nnorm) double @call_abs2705; CGSCC-SAME: (double noundef [[__X:%.*]]) #[[ATTR3]] {2706; CGSCC-NEXT:  entry:2707; CGSCC-NEXT:    [[ABS:%.*]] = tail call noundef nofpclass(ninf nzero nsub nnorm) double @llvm.fabs.f64(double noundef [[__X]]) #[[ATTR19]]2708; CGSCC-NEXT:    ret double [[ABS]]2709;2710entry:2711  %abs = tail call double @llvm.fabs.f64(double %__x)2712  ret double %abs2713}2714 2715define float @bitcast_to_float_sign_0(i32 %arg) {2716; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2717; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @bitcast_to_float_sign_02718; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {2719; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[ARG]], 12720; CHECK-NEXT:    [[CAST:%.*]] = bitcast i32 [[SHR]] to float2721; CHECK-NEXT:    ret float [[CAST]]2722;2723  %shr = lshr i32 %arg, 12724  %cast = bitcast i32 %shr to float2725  ret float %cast2726}2727 2728define float @bitcast_to_float_nnan(i32 %arg) {2729; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2730; CHECK-LABEL: define nofpclass(nan inf nzero nsub nnorm) float @bitcast_to_float_nnan2731; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {2732; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[ARG]], 22733; CHECK-NEXT:    [[CAST:%.*]] = bitcast i32 [[SHR]] to float2734; CHECK-NEXT:    ret float [[CAST]]2735;2736  %shr = lshr i32 %arg, 22737  %cast = bitcast i32 %shr to float2738  ret float %cast2739}2740 2741define float @bitcast_to_float_sign_1(i32 %arg) {2742; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2743; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @bitcast_to_float_sign_12744; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {2745; CHECK-NEXT:    [[OR:%.*]] = or i32 [[ARG]], -21474836482746; CHECK-NEXT:    [[CAST:%.*]] = bitcast i32 [[OR]] to float2747; CHECK-NEXT:    ret float [[CAST]]2748;2749  %or = or i32 %arg, -21474836482750  %cast = bitcast i32 %or to float2751  ret float %cast2752}2753 2754define float @bitcast_to_float_nan(i32 %arg) {2755; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2756; CHECK-LABEL: define nofpclass(inf zero sub norm) float @bitcast_to_float_nan2757; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {2758; CHECK-NEXT:    [[OR:%.*]] = or i32 [[ARG]], 21390950412759; CHECK-NEXT:    [[CAST:%.*]] = bitcast i32 [[OR]] to float2760; CHECK-NEXT:    ret float [[CAST]]2761;2762  %or = or i32 %arg, 21390950412763  %cast = bitcast i32 %or to float2764  ret float %cast2765}2766 2767define float @bitcast_to_float_zero(i32 %arg) {2768; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2769; CHECK-LABEL: define nofpclass(nan inf sub norm) float @bitcast_to_float_zero2770; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {2771; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[ARG]], 312772; CHECK-NEXT:    [[CAST:%.*]] = bitcast i32 [[SHL]] to float2773; CHECK-NEXT:    ret float [[CAST]]2774;2775  %shl = shl i32 %arg, 312776  %cast = bitcast i32 %shl to float2777  ret float %cast2778}2779 2780define float @bitcast_to_float_nzero(i32 %arg) {2781; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2782; CHECK-LABEL: define nofpclass(zero) float @bitcast_to_float_nzero2783; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {2784; CHECK-NEXT:    [[OR:%.*]] = or i32 [[ARG]], 1342177282785; CHECK-NEXT:    [[CAST:%.*]] = bitcast i32 [[OR]] to float2786; CHECK-NEXT:    ret float [[CAST]]2787;2788  %or = or i32 %arg, 1342177282789  %cast = bitcast i32 %or to float2790  ret float %cast2791}2792 2793define float @bitcast_to_float_inf(i32 %arg) {2794; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2795; CHECK-LABEL: define nofpclass(nan zero sub norm) float @bitcast_to_float_inf2796; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] {2797; CHECK-NEXT:    [[SHR:%.*]] = shl i32 [[ARG]], 312798; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHR]], 21390950402799; CHECK-NEXT:    [[CAST:%.*]] = bitcast i32 [[OR]] to float2800; CHECK-NEXT:    ret float [[CAST]]2801;2802  %shr = shl i32 %arg, 312803  %or = or i32 %shr, 21390950402804  %cast = bitcast i32 %or to float2805  ret float %cast2806}2807 2808define double @bitcast_to_double_sign_0(i64 %arg) {2809; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2810; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) double @bitcast_to_double_sign_02811; CHECK-SAME: (i64 [[ARG:%.*]]) #[[ATTR3]] {2812; CHECK-NEXT:    [[SHR:%.*]] = lshr i64 [[ARG]], 12813; CHECK-NEXT:    [[CAST:%.*]] = bitcast i64 [[SHR]] to double2814; CHECK-NEXT:    ret double [[CAST]]2815;2816  %shr = lshr i64 %arg, 12817  %cast = bitcast i64 %shr to double2818  ret double %cast2819}2820 2821define double @bitcast_to_double_nnan(i64 %arg) {2822; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2823; CHECK-LABEL: define nofpclass(nan inf nzero nsub nnorm) double @bitcast_to_double_nnan2824; CHECK-SAME: (i64 [[ARG:%.*]]) #[[ATTR3]] {2825; CHECK-NEXT:    [[SHR:%.*]] = lshr i64 [[ARG]], 22826; CHECK-NEXT:    [[CAST:%.*]] = bitcast i64 [[SHR]] to double2827; CHECK-NEXT:    ret double [[CAST]]2828;2829  %shr = lshr i64 %arg, 22830  %cast = bitcast i64 %shr to double2831  ret double %cast2832}2833 2834define double @bitcast_to_double_sign_1(i64 %arg) {2835; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2836; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) double @bitcast_to_double_sign_12837; CHECK-SAME: (i64 [[ARG:%.*]]) #[[ATTR3]] {2838; CHECK-NEXT:    [[OR:%.*]] = or i64 [[ARG]], -92233720368547758082839; CHECK-NEXT:    [[CAST:%.*]] = bitcast i64 [[OR]] to double2840; CHECK-NEXT:    ret double [[CAST]]2841;2842  %or = or i64 %arg, -92233720368547758082843  %cast = bitcast i64 %or to double2844  ret double %cast2845}2846 2847define double @bitcast_to_double_nan(i64 %arg) {2848; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2849; CHECK-LABEL: define nofpclass(inf zero sub norm) double @bitcast_to_double_nan2850; CHECK-SAME: (i64 [[ARG:%.*]]) #[[ATTR3]] {2851; CHECK-NEXT:    [[OR:%.*]] = or i64 [[ARG]], -45035996273704952852; CHECK-NEXT:    [[CAST:%.*]] = bitcast i64 [[OR]] to double2853; CHECK-NEXT:    ret double [[CAST]]2854;2855  %or = or i64 %arg, -45035996273704952856  %cast = bitcast i64 %or to double2857  ret double %cast2858}2859 2860 2861define double @bitcast_to_double_zero(i64 %arg) {2862; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2863; CHECK-LABEL: define nofpclass(nan inf sub norm) double @bitcast_to_double_zero2864; CHECK-SAME: (i64 [[ARG:%.*]]) #[[ATTR3]] {2865; CHECK-NEXT:    [[SHL:%.*]] = shl i64 [[ARG]], 632866; CHECK-NEXT:    [[CAST:%.*]] = bitcast i64 [[SHL]] to double2867; CHECK-NEXT:    ret double [[CAST]]2868;2869  %shl = shl i64 %arg, 632870  %cast = bitcast i64 %shl to double2871  ret double %cast2872}2873 2874define double @bitcast_to_double_nzero(i64 %arg) {2875; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2876; CHECK-LABEL: define nofpclass(zero) double @bitcast_to_double_nzero2877; CHECK-SAME: (i64 [[ARG:%.*]]) #[[ATTR3]] {2878; CHECK-NEXT:    [[OR:%.*]] = or i64 [[ARG]], 11529215046068469762879; CHECK-NEXT:    [[CAST:%.*]] = bitcast i64 [[OR]] to double2880; CHECK-NEXT:    ret double [[CAST]]2881;2882  %or = or i64 %arg, 11529215046068469762883  %cast = bitcast i64 %or to double2884  ret double %cast2885}2886 2887define double @bitcast_to_double_inf(i64 %arg) {2888; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2889; CHECK-LABEL: define nofpclass(nan zero sub norm) double @bitcast_to_double_inf2890; CHECK-SAME: (i64 [[ARG:%.*]]) #[[ATTR3]] {2891; CHECK-NEXT:    [[SHR:%.*]] = shl i64 [[ARG]], 632892; CHECK-NEXT:    [[OR:%.*]] = or i64 [[SHR]], 92188684372274053122893; CHECK-NEXT:    [[CAST:%.*]] = bitcast i64 [[OR]] to double2894; CHECK-NEXT:    ret double [[CAST]]2895;2896  %shr = shl i64 %arg, 632897  %or = or i64 %shr, 92188684372274053122898  %cast = bitcast i64 %or to double2899  ret double %cast2900}2901 2902 2903define <2 x float> @bitcast_to_float_vect_sign_0(<2 x i32> %arg) {2904; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2905; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) <2 x float> @bitcast_to_float_vect_sign_02906; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR3]] {2907; CHECK-NEXT:    [[SHR:%.*]] = lshr <2 x i32> [[ARG]], <i32 1, i32 2>2908; CHECK-NEXT:    [[CAST:%.*]] = bitcast <2 x i32> [[SHR]] to <2 x float>2909; CHECK-NEXT:    ret <2 x float> [[CAST]]2910;2911  %shr = lshr <2 x i32> %arg, <i32 1, i32 2>2912  %cast = bitcast <2 x i32> %shr to <2 x float>2913  ret <2 x float> %cast2914}2915 2916define <2 x float> @bitcast_to_float_vect_nnan(<2 x i32> %arg) {2917; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2918; CHECK-LABEL: define nofpclass(nan inf nzero nsub nnorm) <2 x float> @bitcast_to_float_vect_nnan2919; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR3]] {2920; CHECK-NEXT:    [[SHR:%.*]] = lshr <2 x i32> [[ARG]], splat (i32 4)2921; CHECK-NEXT:    [[CAST:%.*]] = bitcast <2 x i32> [[SHR]] to <2 x float>2922; CHECK-NEXT:    ret <2 x float> [[CAST]]2923;2924  %shr = lshr <2 x i32> %arg, <i32 4, i32 4>2925  %cast = bitcast <2 x i32> %shr to <2 x float>2926  ret <2 x float> %cast2927}2928 2929define <2 x float> @bitcast_to_float_vect_sign_1(<2 x i32> %arg) {2930; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2931; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) <2 x float> @bitcast_to_float_vect_sign_12932; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR3]] {2933; CHECK-NEXT:    [[OR:%.*]] = or <2 x i32> [[ARG]], splat (i32 -2147483648)2934; CHECK-NEXT:    [[CAST:%.*]] = bitcast <2 x i32> [[OR]] to <2 x float>2935; CHECK-NEXT:    ret <2 x float> [[CAST]]2936;2937  %or = or <2 x i32> %arg, <i32 -2147483648, i32 -2147483648>2938  %cast = bitcast <2 x i32> %or to <2 x float>2939  ret <2 x float> %cast2940}2941 2942define <2 x float> @bitcast_to_float_vect_nan(<2 x i32> %arg) {2943; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2944; CHECK-LABEL: define nofpclass(inf zero sub norm) <2 x float> @bitcast_to_float_vect_nan2945; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR3]] {2946; CHECK-NEXT:    [[OR:%.*]] = or <2 x i32> [[ARG]], splat (i32 2139095041)2947; CHECK-NEXT:    [[CAST:%.*]] = bitcast <2 x i32> [[OR]] to <2 x float>2948; CHECK-NEXT:    ret <2 x float> [[CAST]]2949;2950  %or = or <2 x i32> %arg, <i32 2139095041, i32 2139095041>2951  %cast = bitcast <2 x i32> %or to <2 x float>2952  ret <2 x float> %cast2953}2954 2955define <2 x float> @bitcast_to_float_vect_conservative_1(<2 x i32> %arg) {2956; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2957; CHECK-LABEL: define <2 x float> @bitcast_to_float_vect_conservative_12958; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR3]] {2959; CHECK-NEXT:    [[OR:%.*]] = or <2 x i32> [[ARG]], <i32 -2147483648, i32 0>2960; CHECK-NEXT:    [[CAST:%.*]] = bitcast <2 x i32> [[OR]] to <2 x float>2961; CHECK-NEXT:    ret <2 x float> [[CAST]]2962;2963  %or = or <2 x i32> %arg, <i32 -2147483648, i32 0>2964  %cast = bitcast <2 x i32> %or to <2 x float>2965  ret <2 x float> %cast2966}2967 2968define <2 x float> @bitcast_to_float_vect_conservative_2(<2 x i32> %arg) {2969; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)2970; CHECK-LABEL: define <2 x float> @bitcast_to_float_vect_conservative_22971; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR3]] {2972; CHECK-NEXT:    [[OR:%.*]] = or <2 x i32> [[ARG]], <i32 0, i32 2139095041>2973; CHECK-NEXT:    [[CAST:%.*]] = bitcast <2 x i32> [[OR]] to <2 x float>2974; CHECK-NEXT:    ret <2 x float> [[CAST]]2975;2976  %or = or <2 x i32> %arg, <i32 0, i32 2139095041>2977  %cast = bitcast <2 x i32> %or to <2 x float>2978  ret <2 x float> %cast2979}2980 2981declare i64 @_Z13get_global_idj(i32 noundef)2982 2983attributes #0 = { "denormal-fp-math"="preserve-sign,preserve-sign" }2984attributes #1 = { "denormal-fp-math"="preserve-sign,ieee" }2985attributes #2 = { "denormal-fp-math"="ieee,preserve-sign" }2986attributes #3 = { "denormal-fp-math"="positive-zero,positive-zero" }2987attributes #4 = { "denormal-fp-math"="positive-zero,ieee" }2988attributes #5 = { "denormal-fp-math"="ieee,positive-zero" }2989;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:2990; CGSCC-CI: {{.*}}2991; CGSCC-CV: {{.*}}2992; TUNIT-CI: {{.*}}2993; TUNIT-CV: {{.*}}2994