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