381 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt --passes=slp-vectorizer --mtriple=aarch64 -mattr="+neon,+fullfp16" -S < %s | FileCheck %s3 4@input1_f32 = global [9 x float] zeroinitializer, align 165@input2_f32 = global [9 x float] zeroinitializer, align 166@output_f32 = global [9 x float] zeroinitializer, align 167@input1_f64 = global [9 x double] zeroinitializer, align 168@input2_f64 = global [9 x double] zeroinitializer, align 169@output_f64 = global [9 x double] zeroinitializer, align 1610@input1_f16 = global [9 x half] zeroinitializer, align 1611@input2_f16 = global [9 x half] zeroinitializer, align 1612@output_f16 = global [9 x half] zeroinitializer, align 1613 14define void @fmin32() {15; CHECK-LABEL: define void @fmin32(16; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {17; CHECK-NEXT: [[ENTRY:.*:]]18; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr @input1_f32, align 1619; CHECK-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr @input2_f32, align 1620; CHECK-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.minimumnum.v4f32(<4 x float> [[TMP0]], <4 x float> [[TMP1]])21; CHECK-NEXT: store <4 x float> [[TMP2]], ptr @output_f32, align 1622; CHECK-NEXT: [[TMP3:%.*]] = load <4 x float>, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 1623; CHECK-NEXT: [[TMP4:%.*]] = load <4 x float>, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 1624; CHECK-NEXT: [[TMP5:%.*]] = call <4 x float> @llvm.minimumnum.v4f32(<4 x float> [[TMP3]], <4 x float> [[TMP4]])25; CHECK-NEXT: store <4 x float> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 1626; CHECK-NEXT: [[TMP24:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1627; CHECK-NEXT: [[TMP25:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1628; CHECK-NEXT: [[TMP26:%.*]] = tail call float @llvm.minimumnum.f32(float [[TMP24]], float [[TMP25]])29; CHECK-NEXT: store float [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1630; CHECK-NEXT: ret void31;32entry:33 %input0_0 = load float, ptr @input1_f32, align 1634 %input0_1 = load float, ptr @input2_f32, align 1635 %output0 = tail call float @llvm.minimumnum.f32(float %input0_0, float %input0_1)36 store float %output0, ptr @output_f32, align 1637 %input1_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 4), align 438 %input1_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 4), align 439 %output1 = tail call float @llvm.minimumnum.f32(float %input1_1, float %input1_2)40 store float %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 4), align 441 %input2_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 8), align 842 %input2_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 8), align 843 %output2 = tail call float @llvm.minimumnum.f32(float %input2_1, float %input2_2)44 store float %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 8), align 845 %input3_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 12), align 446 %input3_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 12), align 447 %output3 = tail call float @llvm.minimumnum.f32(float %input3_1, float %input3_2)48 store float %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 12), align 449 %input4_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 1650 %input4_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 1651 %output4 = tail call float @llvm.minimumnum.f32(float %input4_1, float %input4_2)52 store float %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 1653 %input5_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 20), align 454 %input5_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 20), align 455 %output5 = tail call float @llvm.minimumnum.f32(float %input5_1, float %input5_2)56 store float %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 20), align 457 %input6_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 24), align 858 %input6_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 24), align 859 %output6 = tail call float @llvm.minimumnum.f32(float %input6_1, float %input6_2)60 store float %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 24), align 861 %input7_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 28), align 462 %input7_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 28), align 463 %output7 = tail call float @llvm.minimumnum.f32(float %input7_1, float %input7_2)64 store float %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 28), align 465 %input8_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1666 %input8_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1667 %output8 = tail call float @llvm.minimumnum.f32(float %input8_1, float %input8_2)68 store float %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1669 ret void70}71 72declare float @llvm.minimumnum.f32(float, float)73 74define void @fmax32() {75; CHECK-LABEL: define void @fmax32(76; CHECK-SAME: ) #[[ATTR0]] {77; CHECK-NEXT: [[ENTRY:.*:]]78; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr @input1_f32, align 1679; CHECK-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr @input2_f32, align 1680; CHECK-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> [[TMP0]], <4 x float> [[TMP1]])81; CHECK-NEXT: store <4 x float> [[TMP2]], ptr @output_f32, align 1682; CHECK-NEXT: [[TMP3:%.*]] = load <4 x float>, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 1683; CHECK-NEXT: [[TMP4:%.*]] = load <4 x float>, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 1684; CHECK-NEXT: [[TMP5:%.*]] = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> [[TMP3]], <4 x float> [[TMP4]])85; CHECK-NEXT: store <4 x float> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 1686; CHECK-NEXT: [[TMP24:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1687; CHECK-NEXT: [[TMP25:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1688; CHECK-NEXT: [[TMP26:%.*]] = tail call float @llvm.maximumnum.f32(float [[TMP24]], float [[TMP25]])89; CHECK-NEXT: store float [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1690; CHECK-NEXT: ret void91;92entry:93 %input0_0 = load float, ptr @input1_f32, align 1694 %input0_1 = load float, ptr @input2_f32, align 1695 %output0 = tail call float @llvm.maximumnum.f32(float %input0_0, float %input0_1)96 store float %output0, ptr @output_f32, align 1697 %input1_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 4), align 498 %input1_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 4), align 499 %output1 = tail call float @llvm.maximumnum.f32(float %input1_1, float %input1_2)100 store float %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 4), align 4101 %input2_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 8), align 8102 %input2_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 8), align 8103 %output2 = tail call float @llvm.maximumnum.f32(float %input2_1, float %input2_2)104 store float %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 8), align 8105 %input3_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 12), align 4106 %input3_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 12), align 4107 %output3 = tail call float @llvm.maximumnum.f32(float %input3_1, float %input3_2)108 store float %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 12), align 4109 %input4_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 16110 %input4_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 16111 %output4 = tail call float @llvm.maximumnum.f32(float %input4_1, float %input4_2)112 store float %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 16113 %input5_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 20), align 4114 %input5_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 20), align 4115 %output5 = tail call float @llvm.maximumnum.f32(float %input5_1, float %input5_2)116 store float %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 20), align 4117 %input6_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 24), align 8118 %input6_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 24), align 8119 %output6 = tail call float @llvm.maximumnum.f32(float %input6_1, float %input6_2)120 store float %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 24), align 8121 %input7_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 28), align 4122 %input7_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 28), align 4123 %output7 = tail call float @llvm.maximumnum.f32(float %input7_1, float %input7_2)124 store float %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 28), align 4125 %input8_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 16126 %input8_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 16127 %output8 = tail call float @llvm.maximumnum.f32(float %input8_1, float %input8_2)128 store float %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 16129 ret void130}131 132declare float @llvm.maximumnum.f32(float, float)133 134define void @fmin64() {135; CHECK-LABEL: define void @fmin64(136; CHECK-SAME: ) #[[ATTR0]] {137; CHECK-NEXT: [[ENTRY:.*:]]138; CHECK-NEXT: [[TMP0:%.*]] = load <2 x double>, ptr @input1_f64, align 16139; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr @input2_f64, align 16140; CHECK-NEXT: [[TMP2:%.*]] = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]])141; CHECK-NEXT: store <2 x double> [[TMP2]], ptr @output_f64, align 16142; CHECK-NEXT: [[TMP3:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16143; CHECK-NEXT: [[TMP4:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16144; CHECK-NEXT: [[TMP5:%.*]] = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> [[TMP3]], <2 x double> [[TMP4]])145; CHECK-NEXT: store <2 x double> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16146; CHECK-NEXT: [[TMP6:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16147; CHECK-NEXT: [[TMP7:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16148; CHECK-NEXT: [[TMP8:%.*]] = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> [[TMP6]], <2 x double> [[TMP7]])149; CHECK-NEXT: store <2 x double> [[TMP8]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16150; CHECK-NEXT: [[TMP9:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16151; CHECK-NEXT: [[TMP10:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16152; CHECK-NEXT: [[TMP11:%.*]] = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> [[TMP9]], <2 x double> [[TMP10]])153; CHECK-NEXT: store <2 x double> [[TMP11]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16154; CHECK-NEXT: [[TMP24:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16155; CHECK-NEXT: [[TMP25:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16156; CHECK-NEXT: [[TMP26:%.*]] = tail call double @llvm.minimumnum.f64(double [[TMP24]], double [[TMP25]])157; CHECK-NEXT: store double [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16158; CHECK-NEXT: ret void159;160entry:161 %input0_0 = load double, ptr @input1_f64, align 16162 %input0_1 = load double, ptr @input2_f64, align 16163 %output0 = tail call double @llvm.minimumnum.f64(double %input0_0, double %input0_1)164 store double %output0, ptr @output_f64, align 16165 %input1_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 8), align 8166 %input1_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 8), align 8167 %output1 = tail call double @llvm.minimumnum.f64(double %input1_1, double %input1_2)168 store double %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 8), align 8169 %input2_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16170 %input2_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16171 %output2 = tail call double @llvm.minimumnum.f64(double %input2_1, double %input2_2)172 store double %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16173 %input3_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 24), align 8174 %input3_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 24), align 8175 %output3 = tail call double @llvm.minimumnum.f64(double %input3_1, double %input3_2)176 store double %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 24), align 8177 %input4_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16178 %input4_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16179 %output4 = tail call double @llvm.minimumnum.f64(double %input4_1, double %input4_2)180 store double %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16181 %input5_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 40), align 8182 %input5_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 40), align 8183 %output5 = tail call double @llvm.minimumnum.f64(double %input5_1, double %input5_2)184 store double %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 40), align 8185 %input6_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16186 %input6_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16187 %output6 = tail call double @llvm.minimumnum.f64(double %input6_1, double %input6_2)188 store double %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16189 %input7_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 56), align 8190 %input7_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 56), align 8191 %output7 = tail call double @llvm.minimumnum.f64(double %input7_1, double %input7_2)192 store double %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 56), align 8193 %input8_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16194 %input8_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16195 %output8 = tail call double @llvm.minimumnum.f64(double %input8_1, double %input8_2)196 store double %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16197 ret void198}199 200declare double @llvm.minimumnum.f64(double, double)201 202define void @fmax64() {203; CHECK-LABEL: define void @fmax64(204; CHECK-SAME: ) #[[ATTR0]] {205; CHECK-NEXT: [[ENTRY:.*:]]206; CHECK-NEXT: [[TMP0:%.*]] = load <2 x double>, ptr @input1_f64, align 16207; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr @input2_f64, align 16208; CHECK-NEXT: [[TMP2:%.*]] = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]])209; CHECK-NEXT: store <2 x double> [[TMP2]], ptr @output_f64, align 16210; CHECK-NEXT: [[TMP3:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16211; CHECK-NEXT: [[TMP4:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16212; CHECK-NEXT: [[TMP5:%.*]] = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> [[TMP3]], <2 x double> [[TMP4]])213; CHECK-NEXT: store <2 x double> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16214; CHECK-NEXT: [[TMP6:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16215; CHECK-NEXT: [[TMP7:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16216; CHECK-NEXT: [[TMP8:%.*]] = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> [[TMP6]], <2 x double> [[TMP7]])217; CHECK-NEXT: store <2 x double> [[TMP8]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16218; CHECK-NEXT: [[TMP9:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16219; CHECK-NEXT: [[TMP10:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16220; CHECK-NEXT: [[TMP11:%.*]] = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> [[TMP9]], <2 x double> [[TMP10]])221; CHECK-NEXT: store <2 x double> [[TMP11]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16222; CHECK-NEXT: [[TMP24:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16223; CHECK-NEXT: [[TMP25:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16224; CHECK-NEXT: [[TMP26:%.*]] = tail call double @llvm.maximumnum.f64(double [[TMP24]], double [[TMP25]])225; CHECK-NEXT: store double [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16226; CHECK-NEXT: ret void227;228entry:229 %input0_0 = load double, ptr @input1_f64, align 16230 %input0_1 = load double, ptr @input2_f64, align 16231 %output0 = tail call double @llvm.maximumnum.f64(double %input0_0, double %input0_1)232 store double %output0, ptr @output_f64, align 16233 %input1_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 8), align 8234 %input1_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 8), align 8235 %output1 = tail call double @llvm.maximumnum.f64(double %input1_1, double %input1_2)236 store double %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 8), align 8237 %input2_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16238 %input2_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16239 %output2 = tail call double @llvm.maximumnum.f64(double %input2_1, double %input2_2)240 store double %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16241 %input3_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 24), align 8242 %input3_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 24), align 8243 %output3 = tail call double @llvm.maximumnum.f64(double %input3_1, double %input3_2)244 store double %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 24), align 8245 %input4_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16246 %input4_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16247 %output4 = tail call double @llvm.maximumnum.f64(double %input4_1, double %input4_2)248 store double %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16249 %input5_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 40), align 8250 %input5_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 40), align 8251 %output5 = tail call double @llvm.maximumnum.f64(double %input5_1, double %input5_2)252 store double %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 40), align 8253 %input6_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16254 %input6_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16255 %output6 = tail call double @llvm.maximumnum.f64(double %input6_1, double %input6_2)256 store double %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16257 %input7_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 56), align 8258 %input7_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 56), align 8259 %output7 = tail call double @llvm.maximumnum.f64(double %input7_1, double %input7_2)260 store double %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 56), align 8261 %input8_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16262 %input8_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16263 %output8 = tail call double @llvm.maximumnum.f64(double %input8_1, double %input8_2)264 store double %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16265 ret void266}267 268declare double @llvm.maximumnum.f64(double, double)269 270define void @fmin16() {271; CHECK-LABEL: define void @fmin16(272; CHECK-SAME: ) #[[ATTR0]] {273; CHECK-NEXT: [[ENTRY:.*:]]274; CHECK-NEXT: [[TMP0:%.*]] = load <8 x half>, ptr @input1_f16, align 16275; CHECK-NEXT: [[TMP1:%.*]] = load <8 x half>, ptr @input2_f16, align 16276; CHECK-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.minimumnum.v8f16(<8 x half> [[TMP0]], <8 x half> [[TMP1]])277; CHECK-NEXT: store <8 x half> [[TMP2]], ptr @output_f16, align 16278; CHECK-NEXT: [[TMP24:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16279; CHECK-NEXT: [[TMP25:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16280; CHECK-NEXT: [[TMP26:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP24]], half [[TMP25]])281; CHECK-NEXT: store half [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16282; CHECK-NEXT: ret void283;284entry:285 %input0_0 = load half, ptr @input1_f16, align 16286 %input0_1 = load half, ptr @input2_f16, align 16287 %output0 = tail call half @llvm.minimumnum.f16(half %input0_0, half %input0_1)288 store half %output0, ptr @output_f16, align 16289 %input1_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 2), align 2290 %input1_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 2), align 2291 %output1 = tail call half @llvm.minimumnum.f16(half %input1_1, half %input1_2)292 store half %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 2), align 2293 %input2_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 4), align 4294 %input2_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 4), align 4295 %output2 = tail call half @llvm.minimumnum.f16(half %input2_1, half %input2_2)296 store half %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 4), align 4297 %input3_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 6), align 2298 %input3_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 6), align 2299 %output3 = tail call half @llvm.minimumnum.f16(half %input3_1, half %input3_2)300 store half %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 6), align 2301 %input4_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 8), align 8302 %input4_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 8), align 8303 %output4 = tail call half @llvm.minimumnum.f16(half %input4_1, half %input4_2)304 store half %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 8), align 8305 %input5_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 10), align 2306 %input5_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 10), align 2307 %output5 = tail call half @llvm.minimumnum.f16(half %input5_1, half %input5_2)308 store half %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 10), align 2309 %input6_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 12), align 4310 %input6_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 12), align 4311 %output6 = tail call half @llvm.minimumnum.f16(half %input6_1, half %input6_2)312 store half %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 12), align 4313 %input7_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 14), align 2314 %input7_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 14), align 2315 %output7 = tail call half @llvm.minimumnum.f16(half %input7_1, half %input7_2)316 store half %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 14), align 2317 %input8_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16318 %input8_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16319 %output8 = tail call half @llvm.minimumnum.f16(half %input8_1, half %input8_2)320 store half %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16321 ret void322}323 324declare half @llvm.minimumnum.f16(half, half)325 326define void @fmax16() {327; CHECK-LABEL: define void @fmax16(328; CHECK-SAME: ) #[[ATTR0]] {329; CHECK-NEXT: [[ENTRY:.*:]]330; CHECK-NEXT: [[TMP0:%.*]] = load <8 x half>, ptr @input1_f16, align 16331; CHECK-NEXT: [[TMP1:%.*]] = load <8 x half>, ptr @input2_f16, align 16332; CHECK-NEXT: [[TMP2:%.*]] = call <8 x half> @llvm.maximumnum.v8f16(<8 x half> [[TMP0]], <8 x half> [[TMP1]])333; CHECK-NEXT: store <8 x half> [[TMP2]], ptr @output_f16, align 16334; CHECK-NEXT: [[TMP24:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16335; CHECK-NEXT: [[TMP25:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16336; CHECK-NEXT: [[TMP26:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP24]], half [[TMP25]])337; CHECK-NEXT: store half [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16338; CHECK-NEXT: ret void339;340entry:341 %input0_0 = load half, ptr @input1_f16, align 16342 %input0_1 = load half, ptr @input2_f16, align 16343 %output0 = tail call half @llvm.maximumnum.f16(half %input0_0, half %input0_1)344 store half %output0, ptr @output_f16, align 16345 %input1_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 2), align 2346 %input1_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 2), align 2347 %output1 = tail call half @llvm.maximumnum.f16(half %input1_1, half %input1_2)348 store half %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 2), align 2349 %input2_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 4), align 4350 %input2_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 4), align 4351 %output2 = tail call half @llvm.maximumnum.f16(half %input2_1, half %input2_2)352 store half %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 4), align 4353 %input3_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 6), align 2354 %input3_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 6), align 2355 %output3 = tail call half @llvm.maximumnum.f16(half %input3_1, half %input3_2)356 store half %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 6), align 2357 %input4_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 8), align 8358 %input4_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 8), align 8359 %output4 = tail call half @llvm.maximumnum.f16(half %input4_1, half %input4_2)360 store half %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 8), align 8361 %input5_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 10), align 2362 %input5_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 10), align 2363 %output5 = tail call half @llvm.maximumnum.f16(half %input5_1, half %input5_2)364 store half %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 10), align 2365 %input6_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 12), align 4366 %input6_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 12), align 4367 %output6 = tail call half @llvm.maximumnum.f16(half %input6_1, half %input6_2)368 store half %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 12), align 4369 %input7_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 14), align 2370 %input7_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 14), align 2371 %output7 = tail call half @llvm.maximumnum.f16(half %input7_1, half %input7_2)372 store half %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 14), align 2373 %input8_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16374 %input8_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16375 %output8 = tail call half @llvm.maximumnum.f16(half %input8_1, half %input8_2)376 store half %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16377 ret void378}379 380declare half @llvm.maximumnum.f16(half, half)381