brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.9 KiB · 4d43f3f Raw
444 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt --passes=slp-vectorizer --mtriple=riscv64 -mattr="+v,+zvfh" -S < %s | FileCheck %s3; RUN: opt --passes=slp-vectorizer --mtriple=riscv64 -mattr="+v,+zvfhmin" -S < %s | FileCheck %s --check-prefix=ZVFHMIN4 5@input1_f32 = global [9 x float] zeroinitializer, align 166@input2_f32 = global [9 x float] zeroinitializer, align 167@output_f32 = global [9 x float] zeroinitializer, align 168@input1_f64 = global [9 x double] zeroinitializer, align 169@input2_f64 = global [9 x double] zeroinitializer, align 1610@output_f64 = global [9 x double] zeroinitializer, align 1611@input1_f16 = global [9 x half] zeroinitializer, align 1612@input2_f16 = global [9 x half] zeroinitializer, align 1613@output_f16 = global [9 x half] zeroinitializer, align 1614 15define void @fmin32()  {16; CHECK-LABEL: define void @fmin32(17; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {18; CHECK-NEXT:  [[ENTRY:.*:]]19; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x float>, ptr @input1_f32, align 1620; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x float>, ptr @input2_f32, align 1621; CHECK-NEXT:    [[TMP2:%.*]] = call <8 x float> @llvm.minimumnum.v8f32(<8 x float> [[TMP0]], <8 x float> [[TMP1]])22; CHECK-NEXT:    store <8 x float> [[TMP2]], ptr @output_f32, align 1623; CHECK-NEXT:    [[TMP24:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1624; CHECK-NEXT:    [[TMP25:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1625; CHECK-NEXT:    [[TMP26:%.*]] = tail call float @llvm.minimumnum.f32(float [[TMP24]], float [[TMP25]])26; CHECK-NEXT:    store float [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1627; CHECK-NEXT:    ret void28;29; ZVFHMIN-LABEL: define void @fmin32(30; ZVFHMIN-SAME: ) #[[ATTR0:[0-9]+]] {31; ZVFHMIN-NEXT:  [[ENTRY:.*:]]32; ZVFHMIN-NEXT:    [[TMP0:%.*]] = load <8 x float>, ptr @input1_f32, align 1633; ZVFHMIN-NEXT:    [[TMP1:%.*]] = load <8 x float>, ptr @input2_f32, align 1634; ZVFHMIN-NEXT:    [[TMP2:%.*]] = call <8 x float> @llvm.minimumnum.v8f32(<8 x float> [[TMP0]], <8 x float> [[TMP1]])35; ZVFHMIN-NEXT:    store <8 x float> [[TMP2]], ptr @output_f32, align 1636; ZVFHMIN-NEXT:    [[INPUT8_1:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1637; ZVFHMIN-NEXT:    [[INPUT8_2:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1638; ZVFHMIN-NEXT:    [[OUTPUT8:%.*]] = tail call float @llvm.minimumnum.f32(float [[INPUT8_1]], float [[INPUT8_2]])39; ZVFHMIN-NEXT:    store float [[OUTPUT8]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1640; ZVFHMIN-NEXT:    ret void41;42entry:43  %input0_0 = load float, ptr @input1_f32, align 1644  %input0_1 = load float, ptr @input2_f32, align 1645  %output0 = tail call float @llvm.minimumnum.f32(float %input0_0, float %input0_1)46  store float %output0, ptr @output_f32, align 1647  %input1_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 4), align 448  %input1_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 4), align 449  %output1 = tail call float @llvm.minimumnum.f32(float %input1_1, float %input1_2)50  store float %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 4), align 451  %input2_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 8), align 852  %input2_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 8), align 853  %output2 = tail call float @llvm.minimumnum.f32(float %input2_1, float %input2_2)54  store float %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 8), align 855  %input3_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 12), align 456  %input3_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 12), align 457  %output3 = tail call float @llvm.minimumnum.f32(float %input3_1, float %input3_2)58  store float %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 12), align 459  %input4_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 1660  %input4_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 1661  %output4 = tail call float @llvm.minimumnum.f32(float %input4_1, float %input4_2)62  store float %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 1663  %input5_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 20), align 464  %input5_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 20), align 465  %output5 = tail call float @llvm.minimumnum.f32(float %input5_1, float %input5_2)66  store float %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 20), align 467  %input6_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 24), align 868  %input6_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 24), align 869  %output6 = tail call float @llvm.minimumnum.f32(float %input6_1, float %input6_2)70  store float %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 24), align 871  %input7_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 28), align 472  %input7_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 28), align 473  %output7 = tail call float @llvm.minimumnum.f32(float %input7_1, float %input7_2)74  store float %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 28), align 475  %input8_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1676  %input8_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1677  %output8 = tail call float @llvm.minimumnum.f32(float %input8_1, float %input8_2)78  store float %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1679  ret void80}81 82declare float @llvm.minimumnum.f32(float, float)83 84define void @fmax32()  {85; CHECK-LABEL: define void @fmax32(86; CHECK-SAME: ) #[[ATTR0]] {87; CHECK-NEXT:  [[ENTRY:.*:]]88; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x float>, ptr @input1_f32, align 1689; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x float>, ptr @input2_f32, align 1690; CHECK-NEXT:    [[TMP2:%.*]] = call <8 x float> @llvm.maximumnum.v8f32(<8 x float> [[TMP0]], <8 x float> [[TMP1]])91; CHECK-NEXT:    store <8 x float> [[TMP2]], ptr @output_f32, align 1692; CHECK-NEXT:    [[TMP24:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1693; CHECK-NEXT:    [[TMP25:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1694; CHECK-NEXT:    [[TMP26:%.*]] = tail call float @llvm.maximumnum.f32(float [[TMP24]], float [[TMP25]])95; CHECK-NEXT:    store float [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1696; CHECK-NEXT:    ret void97;98; ZVFHMIN-LABEL: define void @fmax32(99; ZVFHMIN-SAME: ) #[[ATTR0]] {100; ZVFHMIN-NEXT:  [[ENTRY:.*:]]101; ZVFHMIN-NEXT:    [[TMP0:%.*]] = load <8 x float>, ptr @input1_f32, align 16102; ZVFHMIN-NEXT:    [[TMP1:%.*]] = load <8 x float>, ptr @input2_f32, align 16103; ZVFHMIN-NEXT:    [[TMP2:%.*]] = call <8 x float> @llvm.maximumnum.v8f32(<8 x float> [[TMP0]], <8 x float> [[TMP1]])104; ZVFHMIN-NEXT:    store <8 x float> [[TMP2]], ptr @output_f32, align 16105; ZVFHMIN-NEXT:    [[INPUT8_1:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 16106; ZVFHMIN-NEXT:    [[INPUT8_2:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 16107; ZVFHMIN-NEXT:    [[OUTPUT8:%.*]] = tail call float @llvm.maximumnum.f32(float [[INPUT8_1]], float [[INPUT8_2]])108; ZVFHMIN-NEXT:    store float [[OUTPUT8]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 16109; ZVFHMIN-NEXT:    ret void110;111entry:112  %input0_0 = load float, ptr @input1_f32, align 16113  %input0_1 = load float, ptr @input2_f32, align 16114  %output0 = tail call float @llvm.maximumnum.f32(float %input0_0, float %input0_1)115  store float %output0, ptr @output_f32, align 16116  %input1_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 4), align 4117  %input1_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 4), align 4118  %output1 = tail call float @llvm.maximumnum.f32(float %input1_1, float %input1_2)119  store float %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 4), align 4120  %input2_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 8), align 8121  %input2_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 8), align 8122  %output2 = tail call float @llvm.maximumnum.f32(float %input2_1, float %input2_2)123  store float %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 8), align 8124  %input3_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 12), align 4125  %input3_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 12), align 4126  %output3 = tail call float @llvm.maximumnum.f32(float %input3_1, float %input3_2)127  store float %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 12), align 4128  %input4_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 16129  %input4_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 16130  %output4 = tail call float @llvm.maximumnum.f32(float %input4_1, float %input4_2)131  store float %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 16132  %input5_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 20), align 4133  %input5_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 20), align 4134  %output5 = tail call float @llvm.maximumnum.f32(float %input5_1, float %input5_2)135  store float %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 20), align 4136  %input6_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 24), align 8137  %input6_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 24), align 8138  %output6 = tail call float @llvm.maximumnum.f32(float %input6_1, float %input6_2)139  store float %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 24), align 8140  %input7_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 28), align 4141  %input7_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 28), align 4142  %output7 = tail call float @llvm.maximumnum.f32(float %input7_1, float %input7_2)143  store float %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 28), align 4144  %input8_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 16145  %input8_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 16146  %output8 = tail call float @llvm.maximumnum.f32(float %input8_1, float %input8_2)147  store float %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 16148  ret void149}150 151declare float @llvm.maximumnum.f32(float, float)152 153define void @fmin64()  {154; CHECK-LABEL: define void @fmin64(155; CHECK-SAME: ) #[[ATTR0]] {156; CHECK-NEXT:  [[ENTRY:.*:]]157; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x double>, ptr @input1_f64, align 16158; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr @input2_f64, align 16159; CHECK-NEXT:    [[TMP2:%.*]] = call <4 x double> @llvm.minimumnum.v4f64(<4 x double> [[TMP0]], <4 x double> [[TMP1]])160; CHECK-NEXT:    store <4 x double> [[TMP2]], ptr @output_f64, align 16161; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16162; CHECK-NEXT:    [[TMP4:%.*]] = load <4 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16163; CHECK-NEXT:    [[TMP5:%.*]] = call <4 x double> @llvm.minimumnum.v4f64(<4 x double> [[TMP3]], <4 x double> [[TMP4]])164; CHECK-NEXT:    store <4 x double> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16165; CHECK-NEXT:    [[TMP24:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16166; CHECK-NEXT:    [[TMP25:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16167; CHECK-NEXT:    [[TMP26:%.*]] = tail call double @llvm.minimumnum.f64(double [[TMP24]], double [[TMP25]])168; CHECK-NEXT:    store double [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16169; CHECK-NEXT:    ret void170;171; ZVFHMIN-LABEL: define void @fmin64(172; ZVFHMIN-SAME: ) #[[ATTR0]] {173; ZVFHMIN-NEXT:  [[ENTRY:.*:]]174; ZVFHMIN-NEXT:    [[TMP0:%.*]] = load <4 x double>, ptr @input1_f64, align 16175; ZVFHMIN-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr @input2_f64, align 16176; ZVFHMIN-NEXT:    [[TMP2:%.*]] = call <4 x double> @llvm.minimumnum.v4f64(<4 x double> [[TMP0]], <4 x double> [[TMP1]])177; ZVFHMIN-NEXT:    store <4 x double> [[TMP2]], ptr @output_f64, align 16178; ZVFHMIN-NEXT:    [[TMP3:%.*]] = load <4 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16179; ZVFHMIN-NEXT:    [[TMP4:%.*]] = load <4 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16180; ZVFHMIN-NEXT:    [[TMP5:%.*]] = call <4 x double> @llvm.minimumnum.v4f64(<4 x double> [[TMP3]], <4 x double> [[TMP4]])181; ZVFHMIN-NEXT:    store <4 x double> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16182; ZVFHMIN-NEXT:    [[INPUT8_1:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16183; ZVFHMIN-NEXT:    [[INPUT8_2:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16184; ZVFHMIN-NEXT:    [[OUTPUT8:%.*]] = tail call double @llvm.minimumnum.f64(double [[INPUT8_1]], double [[INPUT8_2]])185; ZVFHMIN-NEXT:    store double [[OUTPUT8]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16186; ZVFHMIN-NEXT:    ret void187;188entry:189  %input0_0 = load double, ptr @input1_f64, align 16190  %input0_1 = load double, ptr @input2_f64, align 16191  %output0 = tail call double @llvm.minimumnum.f64(double %input0_0, double %input0_1)192  store double %output0, ptr @output_f64, align 16193  %input1_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 8), align 8194  %input1_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 8), align 8195  %output1 = tail call double @llvm.minimumnum.f64(double %input1_1, double %input1_2)196  store double %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 8), align 8197  %input2_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16198  %input2_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16199  %output2 = tail call double @llvm.minimumnum.f64(double %input2_1, double %input2_2)200  store double %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16201  %input3_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 24), align 8202  %input3_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 24), align 8203  %output3 = tail call double @llvm.minimumnum.f64(double %input3_1, double %input3_2)204  store double %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 24), align 8205  %input4_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16206  %input4_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16207  %output4 = tail call double @llvm.minimumnum.f64(double %input4_1, double %input4_2)208  store double %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16209  %input5_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 40), align 8210  %input5_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 40), align 8211  %output5 = tail call double @llvm.minimumnum.f64(double %input5_1, double %input5_2)212  store double %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 40), align 8213  %input6_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16214  %input6_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16215  %output6 = tail call double @llvm.minimumnum.f64(double %input6_1, double %input6_2)216  store double %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16217  %input7_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 56), align 8218  %input7_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 56), align 8219  %output7 = tail call double @llvm.minimumnum.f64(double %input7_1, double %input7_2)220  store double %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 56), align 8221  %input8_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16222  %input8_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16223  %output8 = tail call double @llvm.minimumnum.f64(double %input8_1, double %input8_2)224  store double %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16225  ret void226}227 228declare double @llvm.minimumnum.f64(double, double)229 230define void @fmax64()  {231; CHECK-LABEL: define void @fmax64(232; CHECK-SAME: ) #[[ATTR0]] {233; CHECK-NEXT:  [[ENTRY:.*:]]234; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x double>, ptr @input1_f64, align 16235; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr @input2_f64, align 16236; CHECK-NEXT:    [[TMP2:%.*]] = call <4 x double> @llvm.maximumnum.v4f64(<4 x double> [[TMP0]], <4 x double> [[TMP1]])237; CHECK-NEXT:    store <4 x double> [[TMP2]], ptr @output_f64, align 16238; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16239; CHECK-NEXT:    [[TMP4:%.*]] = load <4 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16240; CHECK-NEXT:    [[TMP5:%.*]] = call <4 x double> @llvm.maximumnum.v4f64(<4 x double> [[TMP3]], <4 x double> [[TMP4]])241; CHECK-NEXT:    store <4 x double> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16242; CHECK-NEXT:    [[TMP24:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16243; CHECK-NEXT:    [[TMP25:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16244; CHECK-NEXT:    [[TMP26:%.*]] = tail call double @llvm.maximumnum.f64(double [[TMP24]], double [[TMP25]])245; CHECK-NEXT:    store double [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16246; CHECK-NEXT:    ret void247;248; ZVFHMIN-LABEL: define void @fmax64(249; ZVFHMIN-SAME: ) #[[ATTR0]] {250; ZVFHMIN-NEXT:  [[ENTRY:.*:]]251; ZVFHMIN-NEXT:    [[TMP0:%.*]] = load <4 x double>, ptr @input1_f64, align 16252; ZVFHMIN-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr @input2_f64, align 16253; ZVFHMIN-NEXT:    [[TMP2:%.*]] = call <4 x double> @llvm.maximumnum.v4f64(<4 x double> [[TMP0]], <4 x double> [[TMP1]])254; ZVFHMIN-NEXT:    store <4 x double> [[TMP2]], ptr @output_f64, align 16255; ZVFHMIN-NEXT:    [[TMP3:%.*]] = load <4 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16256; ZVFHMIN-NEXT:    [[TMP4:%.*]] = load <4 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16257; ZVFHMIN-NEXT:    [[TMP5:%.*]] = call <4 x double> @llvm.maximumnum.v4f64(<4 x double> [[TMP3]], <4 x double> [[TMP4]])258; ZVFHMIN-NEXT:    store <4 x double> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16259; ZVFHMIN-NEXT:    [[INPUT8_1:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16260; ZVFHMIN-NEXT:    [[INPUT8_2:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16261; ZVFHMIN-NEXT:    [[OUTPUT8:%.*]] = tail call double @llvm.maximumnum.f64(double [[INPUT8_1]], double [[INPUT8_2]])262; ZVFHMIN-NEXT:    store double [[OUTPUT8]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16263; ZVFHMIN-NEXT:    ret void264;265entry:266  %input0_0 = load double, ptr @input1_f64, align 16267  %input0_1 = load double, ptr @input2_f64, align 16268  %output0 = tail call double @llvm.maximumnum.f64(double %input0_0, double %input0_1)269  store double %output0, ptr @output_f64, align 16270  %input1_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 8), align 8271  %input1_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 8), align 8272  %output1 = tail call double @llvm.maximumnum.f64(double %input1_1, double %input1_2)273  store double %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 8), align 8274  %input2_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16275  %input2_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16276  %output2 = tail call double @llvm.maximumnum.f64(double %input2_1, double %input2_2)277  store double %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16278  %input3_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 24), align 8279  %input3_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 24), align 8280  %output3 = tail call double @llvm.maximumnum.f64(double %input3_1, double %input3_2)281  store double %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 24), align 8282  %input4_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16283  %input4_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16284  %output4 = tail call double @llvm.maximumnum.f64(double %input4_1, double %input4_2)285  store double %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16286  %input5_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 40), align 8287  %input5_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 40), align 8288  %output5 = tail call double @llvm.maximumnum.f64(double %input5_1, double %input5_2)289  store double %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 40), align 8290  %input6_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16291  %input6_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16292  %output6 = tail call double @llvm.maximumnum.f64(double %input6_1, double %input6_2)293  store double %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16294  %input7_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 56), align 8295  %input7_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 56), align 8296  %output7 = tail call double @llvm.maximumnum.f64(double %input7_1, double %input7_2)297  store double %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 56), align 8298  %input8_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16299  %input8_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16300  %output8 = tail call double @llvm.maximumnum.f64(double %input8_1, double %input8_2)301  store double %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16302  ret void303}304 305declare double @llvm.maximumnum.f64(double, double)306 307define void @fmin16()  {308; CHECK-LABEL: define void @fmin16(309; CHECK-SAME: ) #[[ATTR0]] {310; CHECK-NEXT:  [[ENTRY:.*:]]311; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x half>, ptr @input1_f16, align 16312; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x half>, ptr @input2_f16, align 16313; CHECK-NEXT:    [[TMP2:%.*]] = call <8 x half> @llvm.minimumnum.v8f16(<8 x half> [[TMP0]], <8 x half> [[TMP1]])314; CHECK-NEXT:    store <8 x half> [[TMP2]], ptr @output_f16, align 16315; CHECK-NEXT:    [[TMP24:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16316; CHECK-NEXT:    [[TMP25:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16317; CHECK-NEXT:    [[TMP26:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP24]], half [[TMP25]])318; CHECK-NEXT:    store half [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16319; CHECK-NEXT:    ret void320;321; ZVFHMIN-LABEL: define void @fmin16(322; ZVFHMIN-SAME: ) #[[ATTR0]] {323; ZVFHMIN-NEXT:  [[ENTRY:.*:]]324; ZVFHMIN-NEXT:    [[TMP0:%.*]] = load <8 x half>, ptr @input1_f16, align 16325; ZVFHMIN-NEXT:    [[TMP1:%.*]] = load <8 x half>, ptr @input2_f16, align 16326; ZVFHMIN-NEXT:    [[TMP2:%.*]] = call <8 x half> @llvm.minimumnum.v8f16(<8 x half> [[TMP0]], <8 x half> [[TMP1]])327; ZVFHMIN-NEXT:    store <8 x half> [[TMP2]], ptr @output_f16, align 16328; ZVFHMIN-NEXT:    [[INPUT8_1:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16329; ZVFHMIN-NEXT:    [[INPUT8_2:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16330; ZVFHMIN-NEXT:    [[OUTPUT8:%.*]] = tail call half @llvm.minimumnum.f16(half [[INPUT8_1]], half [[INPUT8_2]])331; ZVFHMIN-NEXT:    store half [[OUTPUT8]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16332; ZVFHMIN-NEXT:    ret void333;334entry:335  %input0_0 = load half, ptr @input1_f16, align 16336  %input0_1 = load half, ptr @input2_f16, align 16337  %output0 = tail call half @llvm.minimumnum.f16(half %input0_0, half %input0_1)338  store half %output0, ptr @output_f16, align 16339  %input1_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 2), align 2340  %input1_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 2), align 2341  %output1 = tail call half @llvm.minimumnum.f16(half %input1_1, half %input1_2)342  store half %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 2), align 2343  %input2_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 4), align 4344  %input2_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 4), align 4345  %output2 = tail call half @llvm.minimumnum.f16(half %input2_1, half %input2_2)346  store half %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 4), align 4347  %input3_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 6), align 2348  %input3_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 6), align 2349  %output3 = tail call half @llvm.minimumnum.f16(half %input3_1, half %input3_2)350  store half %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 6), align 2351  %input4_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 8), align 8352  %input4_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 8), align 8353  %output4 = tail call half @llvm.minimumnum.f16(half %input4_1, half %input4_2)354  store half %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 8), align 8355  %input5_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 10), align 2356  %input5_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 10), align 2357  %output5 = tail call half @llvm.minimumnum.f16(half %input5_1, half %input5_2)358  store half %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 10), align 2359  %input6_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 12), align 4360  %input6_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 12), align 4361  %output6 = tail call half @llvm.minimumnum.f16(half %input6_1, half %input6_2)362  store half %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 12), align 4363  %input7_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 14), align 2364  %input7_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 14), align 2365  %output7 = tail call half @llvm.minimumnum.f16(half %input7_1, half %input7_2)366  store half %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 14), align 2367  %input8_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16368  %input8_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16369  %output8 = tail call half @llvm.minimumnum.f16(half %input8_1, half %input8_2)370  store half %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16371  ret void372}373 374declare half @llvm.minimumnum.f16(half, half)375 376define void @fmax16()  {377; CHECK-LABEL: define void @fmax16(378; CHECK-SAME: ) #[[ATTR0]] {379; CHECK-NEXT:  [[ENTRY:.*:]]380; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x half>, ptr @input1_f16, align 16381; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x half>, ptr @input2_f16, align 16382; CHECK-NEXT:    [[TMP2:%.*]] = call <8 x half> @llvm.maximumnum.v8f16(<8 x half> [[TMP0]], <8 x half> [[TMP1]])383; CHECK-NEXT:    store <8 x half> [[TMP2]], ptr @output_f16, align 16384; CHECK-NEXT:    [[TMP24:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16385; CHECK-NEXT:    [[TMP25:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16386; CHECK-NEXT:    [[TMP26:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP24]], half [[TMP25]])387; CHECK-NEXT:    store half [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16388; CHECK-NEXT:    ret void389;390; ZVFHMIN-LABEL: define void @fmax16(391; ZVFHMIN-SAME: ) #[[ATTR0]] {392; ZVFHMIN-NEXT:  [[ENTRY:.*:]]393; ZVFHMIN-NEXT:    [[TMP0:%.*]] = load <8 x half>, ptr @input1_f16, align 16394; ZVFHMIN-NEXT:    [[TMP1:%.*]] = load <8 x half>, ptr @input2_f16, align 16395; ZVFHMIN-NEXT:    [[TMP2:%.*]] = call <8 x half> @llvm.maximumnum.v8f16(<8 x half> [[TMP0]], <8 x half> [[TMP1]])396; ZVFHMIN-NEXT:    store <8 x half> [[TMP2]], ptr @output_f16, align 16397; ZVFHMIN-NEXT:    [[INPUT8_1:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16398; ZVFHMIN-NEXT:    [[INPUT8_2:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16399; ZVFHMIN-NEXT:    [[OUTPUT8:%.*]] = tail call half @llvm.maximumnum.f16(half [[INPUT8_1]], half [[INPUT8_2]])400; ZVFHMIN-NEXT:    store half [[OUTPUT8]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16401; ZVFHMIN-NEXT:    ret void402;403entry:404  %input0_0 = load half, ptr @input1_f16, align 16405  %input0_1 = load half, ptr @input2_f16, align 16406  %output0 = tail call half @llvm.maximumnum.f16(half %input0_0, half %input0_1)407  store half %output0, ptr @output_f16, align 16408  %input1_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 2), align 2409  %input1_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 2), align 2410  %output1 = tail call half @llvm.maximumnum.f16(half %input1_1, half %input1_2)411  store half %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 2), align 2412  %input2_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 4), align 4413  %input2_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 4), align 4414  %output2 = tail call half @llvm.maximumnum.f16(half %input2_1, half %input2_2)415  store half %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 4), align 4416  %input3_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 6), align 2417  %input3_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 6), align 2418  %output3 = tail call half @llvm.maximumnum.f16(half %input3_1, half %input3_2)419  store half %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 6), align 2420  %input4_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 8), align 8421  %input4_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 8), align 8422  %output4 = tail call half @llvm.maximumnum.f16(half %input4_1, half %input4_2)423  store half %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 8), align 8424  %input5_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 10), align 2425  %input5_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 10), align 2426  %output5 = tail call half @llvm.maximumnum.f16(half %input5_1, half %input5_2)427  store half %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 10), align 2428  %input6_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 12), align 4429  %input6_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 12), align 4430  %output6 = tail call half @llvm.maximumnum.f16(half %input6_1, half %input6_2)431  store half %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 12), align 4432  %input7_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 14), align 2433  %input7_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 14), align 2434  %output7 = tail call half @llvm.maximumnum.f16(half %input7_1, half %input7_2)435  store half %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 14), align 2436  %input8_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16437  %input8_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16438  %output8 = tail call half @llvm.maximumnum.f16(half %input8_1, half %input8_2)439  store half %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16440  ret void441}442 443declare half @llvm.maximumnum.f16(half, half)444