431 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt --passes=slp-vectorizer --mtriple=x86_64 -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-NEXT: [[ENTRY:.*:]]17; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr @input1_f32, align 1618; CHECK-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr @input2_f32, align 1619; CHECK-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.minimumnum.v4f32(<4 x float> [[TMP0]], <4 x float> [[TMP1]])20; CHECK-NEXT: store <4 x float> [[TMP2]], ptr @output_f32, align 1621; CHECK-NEXT: [[TMP3:%.*]] = load <4 x float>, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 1622; CHECK-NEXT: [[TMP4:%.*]] = load <4 x float>, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 1623; CHECK-NEXT: [[TMP5:%.*]] = call <4 x float> @llvm.minimumnum.v4f32(<4 x float> [[TMP3]], <4 x float> [[TMP4]])24; CHECK-NEXT: store <4 x float> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 1625; CHECK-NEXT: [[TMP24:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1626; CHECK-NEXT: [[TMP25:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1627; CHECK-NEXT: [[TMP26:%.*]] = tail call float @llvm.minimumnum.f32(float [[TMP24]], float [[TMP25]])28; CHECK-NEXT: store float [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1629; CHECK-NEXT: ret void30;31entry:32 %input0_0 = load float, ptr @input1_f32, align 1633 %input0_1 = load float, ptr @input2_f32, align 1634 %output0 = tail call float @llvm.minimumnum.f32(float %input0_0, float %input0_1)35 store float %output0, ptr @output_f32, align 1636 %input1_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 4), align 437 %input1_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 4), align 438 %output1 = tail call float @llvm.minimumnum.f32(float %input1_1, float %input1_2)39 store float %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 4), align 440 %input2_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 8), align 841 %input2_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 8), align 842 %output2 = tail call float @llvm.minimumnum.f32(float %input2_1, float %input2_2)43 store float %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 8), align 844 %input3_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 12), align 445 %input3_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 12), align 446 %output3 = tail call float @llvm.minimumnum.f32(float %input3_1, float %input3_2)47 store float %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 12), align 448 %input4_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 1649 %input4_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 1650 %output4 = tail call float @llvm.minimumnum.f32(float %input4_1, float %input4_2)51 store float %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 1652 %input5_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 20), align 453 %input5_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 20), align 454 %output5 = tail call float @llvm.minimumnum.f32(float %input5_1, float %input5_2)55 store float %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 20), align 456 %input6_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 24), align 857 %input6_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 24), align 858 %output6 = tail call float @llvm.minimumnum.f32(float %input6_1, float %input6_2)59 store float %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 24), align 860 %input7_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 28), align 461 %input7_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 28), align 462 %output7 = tail call float @llvm.minimumnum.f32(float %input7_1, float %input7_2)63 store float %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 28), align 464 %input8_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1665 %input8_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1666 %output8 = tail call float @llvm.minimumnum.f32(float %input8_1, float %input8_2)67 store float %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1668 ret void69}70 71declare float @llvm.minimumnum.f32(float, float)72 73define void @fmax32() {74; CHECK-LABEL: define void @fmax32() {75; CHECK-NEXT: [[ENTRY:.*:]]76; CHECK-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr @input1_f32, align 1677; CHECK-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr @input2_f32, align 1678; CHECK-NEXT: [[TMP2:%.*]] = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> [[TMP0]], <4 x float> [[TMP1]])79; CHECK-NEXT: store <4 x float> [[TMP2]], ptr @output_f32, align 1680; CHECK-NEXT: [[TMP3:%.*]] = load <4 x float>, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 1681; CHECK-NEXT: [[TMP4:%.*]] = load <4 x float>, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 1682; CHECK-NEXT: [[TMP5:%.*]] = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> [[TMP3]], <4 x float> [[TMP4]])83; CHECK-NEXT: store <4 x float> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 1684; CHECK-NEXT: [[TMP24:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 1685; CHECK-NEXT: [[TMP25:%.*]] = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 1686; CHECK-NEXT: [[TMP26:%.*]] = tail call float @llvm.maximumnum.f32(float [[TMP24]], float [[TMP25]])87; CHECK-NEXT: store float [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 1688; CHECK-NEXT: ret void89;90entry:91 %input0_0 = load float, ptr @input1_f32, align 1692 %input0_1 = load float, ptr @input2_f32, align 1693 %output0 = tail call float @llvm.maximumnum.f32(float %input0_0, float %input0_1)94 store float %output0, ptr @output_f32, align 1695 %input1_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 4), align 496 %input1_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 4), align 497 %output1 = tail call float @llvm.maximumnum.f32(float %input1_1, float %input1_2)98 store float %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 4), align 499 %input2_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 8), align 8100 %input2_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 8), align 8101 %output2 = tail call float @llvm.maximumnum.f32(float %input2_1, float %input2_2)102 store float %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 8), align 8103 %input3_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 12), align 4104 %input3_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 12), align 4105 %output3 = tail call float @llvm.maximumnum.f32(float %input3_1, float %input3_2)106 store float %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 12), align 4107 %input4_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 16), align 16108 %input4_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 16), align 16109 %output4 = tail call float @llvm.maximumnum.f32(float %input4_1, float %input4_2)110 store float %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 16), align 16111 %input5_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 20), align 4112 %input5_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 20), align 4113 %output5 = tail call float @llvm.maximumnum.f32(float %input5_1, float %input5_2)114 store float %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 20), align 4115 %input6_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 24), align 8116 %input6_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 24), align 8117 %output6 = tail call float @llvm.maximumnum.f32(float %input6_1, float %input6_2)118 store float %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 24), align 8119 %input7_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 28), align 4120 %input7_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 28), align 4121 %output7 = tail call float @llvm.maximumnum.f32(float %input7_1, float %input7_2)122 store float %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 28), align 4123 %input8_1 = load float, ptr getelementptr inbounds nuw (i8, ptr @input1_f32, i64 32), align 16124 %input8_2 = load float, ptr getelementptr inbounds nuw (i8, ptr @input2_f32, i64 32), align 16125 %output8 = tail call float @llvm.maximumnum.f32(float %input8_1, float %input8_2)126 store float %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f32, i64 32), align 16127 ret void128}129 130declare float @llvm.maximumnum.f32(float, float)131 132define void @fmin64() {133; CHECK-LABEL: define void @fmin64() {134; CHECK-NEXT: [[ENTRY:.*:]]135; CHECK-NEXT: [[TMP0:%.*]] = load <2 x double>, ptr @input1_f64, align 16136; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr @input2_f64, align 16137; CHECK-NEXT: [[TMP2:%.*]] = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]])138; CHECK-NEXT: store <2 x double> [[TMP2]], ptr @output_f64, align 16139; CHECK-NEXT: [[TMP3:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16140; CHECK-NEXT: [[TMP4:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16141; CHECK-NEXT: [[TMP5:%.*]] = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> [[TMP3]], <2 x double> [[TMP4]])142; CHECK-NEXT: store <2 x double> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16143; CHECK-NEXT: [[TMP6:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16144; CHECK-NEXT: [[TMP7:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16145; CHECK-NEXT: [[TMP8:%.*]] = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> [[TMP6]], <2 x double> [[TMP7]])146; CHECK-NEXT: store <2 x double> [[TMP8]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16147; CHECK-NEXT: [[TMP9:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16148; CHECK-NEXT: [[TMP10:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16149; CHECK-NEXT: [[TMP11:%.*]] = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> [[TMP9]], <2 x double> [[TMP10]])150; CHECK-NEXT: store <2 x double> [[TMP11]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16151; CHECK-NEXT: [[TMP24:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16152; CHECK-NEXT: [[TMP25:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16153; CHECK-NEXT: [[TMP26:%.*]] = tail call double @llvm.minimumnum.f64(double [[TMP24]], double [[TMP25]])154; CHECK-NEXT: store double [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16155; CHECK-NEXT: ret void156;157entry:158 %input0_0 = load double, ptr @input1_f64, align 16159 %input0_1 = load double, ptr @input2_f64, align 16160 %output0 = tail call double @llvm.minimumnum.f64(double %input0_0, double %input0_1)161 store double %output0, ptr @output_f64, align 16162 %input1_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 8), align 8163 %input1_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 8), align 8164 %output1 = tail call double @llvm.minimumnum.f64(double %input1_1, double %input1_2)165 store double %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 8), align 8166 %input2_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16167 %input2_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16168 %output2 = tail call double @llvm.minimumnum.f64(double %input2_1, double %input2_2)169 store double %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16170 %input3_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 24), align 8171 %input3_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 24), align 8172 %output3 = tail call double @llvm.minimumnum.f64(double %input3_1, double %input3_2)173 store double %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 24), align 8174 %input4_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16175 %input4_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16176 %output4 = tail call double @llvm.minimumnum.f64(double %input4_1, double %input4_2)177 store double %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16178 %input5_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 40), align 8179 %input5_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 40), align 8180 %output5 = tail call double @llvm.minimumnum.f64(double %input5_1, double %input5_2)181 store double %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 40), align 8182 %input6_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16183 %input6_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16184 %output6 = tail call double @llvm.minimumnum.f64(double %input6_1, double %input6_2)185 store double %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16186 %input7_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 56), align 8187 %input7_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 56), align 8188 %output7 = tail call double @llvm.minimumnum.f64(double %input7_1, double %input7_2)189 store double %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 56), align 8190 %input8_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16191 %input8_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16192 %output8 = tail call double @llvm.minimumnum.f64(double %input8_1, double %input8_2)193 store double %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16194 ret void195}196 197declare double @llvm.minimumnum.f64(double, double)198 199define void @fmax64() {200; CHECK-LABEL: define void @fmax64() {201; CHECK-NEXT: [[ENTRY:.*:]]202; CHECK-NEXT: [[TMP0:%.*]] = load <2 x double>, ptr @input1_f64, align 16203; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr @input2_f64, align 16204; CHECK-NEXT: [[TMP2:%.*]] = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]])205; CHECK-NEXT: store <2 x double> [[TMP2]], ptr @output_f64, align 16206; CHECK-NEXT: [[TMP3:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16207; CHECK-NEXT: [[TMP4:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16208; CHECK-NEXT: [[TMP5:%.*]] = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> [[TMP3]], <2 x double> [[TMP4]])209; CHECK-NEXT: store <2 x double> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16210; CHECK-NEXT: [[TMP6:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16211; CHECK-NEXT: [[TMP7:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16212; CHECK-NEXT: [[TMP8:%.*]] = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> [[TMP6]], <2 x double> [[TMP7]])213; CHECK-NEXT: store <2 x double> [[TMP8]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16214; CHECK-NEXT: [[TMP9:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16215; CHECK-NEXT: [[TMP10:%.*]] = load <2 x double>, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16216; CHECK-NEXT: [[TMP11:%.*]] = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> [[TMP9]], <2 x double> [[TMP10]])217; CHECK-NEXT: store <2 x double> [[TMP11]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16218; CHECK-NEXT: [[TMP24:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16219; CHECK-NEXT: [[TMP25:%.*]] = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16220; CHECK-NEXT: [[TMP26:%.*]] = tail call double @llvm.maximumnum.f64(double [[TMP24]], double [[TMP25]])221; CHECK-NEXT: store double [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16222; CHECK-NEXT: ret void223;224entry:225 %input0_0 = load double, ptr @input1_f64, align 16226 %input0_1 = load double, ptr @input2_f64, align 16227 %output0 = tail call double @llvm.maximumnum.f64(double %input0_0, double %input0_1)228 store double %output0, ptr @output_f64, align 16229 %input1_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 8), align 8230 %input1_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 8), align 8231 %output1 = tail call double @llvm.maximumnum.f64(double %input1_1, double %input1_2)232 store double %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 8), align 8233 %input2_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 16), align 16234 %input2_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 16), align 16235 %output2 = tail call double @llvm.maximumnum.f64(double %input2_1, double %input2_2)236 store double %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 16), align 16237 %input3_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 24), align 8238 %input3_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 24), align 8239 %output3 = tail call double @llvm.maximumnum.f64(double %input3_1, double %input3_2)240 store double %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 24), align 8241 %input4_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 32), align 16242 %input4_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 32), align 16243 %output4 = tail call double @llvm.maximumnum.f64(double %input4_1, double %input4_2)244 store double %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 32), align 16245 %input5_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 40), align 8246 %input5_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 40), align 8247 %output5 = tail call double @llvm.maximumnum.f64(double %input5_1, double %input5_2)248 store double %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 40), align 8249 %input6_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 48), align 16250 %input6_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 48), align 16251 %output6 = tail call double @llvm.maximumnum.f64(double %input6_1, double %input6_2)252 store double %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 48), align 16253 %input7_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 56), align 8254 %input7_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 56), align 8255 %output7 = tail call double @llvm.maximumnum.f64(double %input7_1, double %input7_2)256 store double %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 56), align 8257 %input8_1 = load double, ptr getelementptr inbounds nuw (i8, ptr @input1_f64, i64 64), align 16258 %input8_2 = load double, ptr getelementptr inbounds nuw (i8, ptr @input2_f64, i64 64), align 16259 %output8 = tail call double @llvm.maximumnum.f64(double %input8_1, double %input8_2)260 store double %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f64, i64 64), align 16261 ret void262}263 264declare double @llvm.maximumnum.f64(double, double)265 266define void @fmin16() {267; CHECK-LABEL: define void @fmin16() {268; CHECK-NEXT: [[ENTRY:.*:]]269; CHECK-NEXT: [[TMP0:%.*]] = load half, ptr @input1_f16, align 16270; CHECK-NEXT: [[TMP1:%.*]] = load half, ptr @input2_f16, align 16271; CHECK-NEXT: [[TMP2:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP0]], half [[TMP1]])272; CHECK-NEXT: store half [[TMP2]], ptr @output_f16, align 16273; CHECK-NEXT: [[TMP3:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 2), align 2274; CHECK-NEXT: [[TMP4:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 2), align 2275; CHECK-NEXT: [[TMP5:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP3]], half [[TMP4]])276; CHECK-NEXT: store half [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 2), align 2277; CHECK-NEXT: [[TMP6:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 4), align 4278; CHECK-NEXT: [[TMP7:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 4), align 4279; CHECK-NEXT: [[TMP8:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP6]], half [[TMP7]])280; CHECK-NEXT: store half [[TMP8]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 4), align 4281; CHECK-NEXT: [[TMP9:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 6), align 2282; CHECK-NEXT: [[TMP10:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 6), align 2283; CHECK-NEXT: [[TMP11:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP9]], half [[TMP10]])284; CHECK-NEXT: store half [[TMP11]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 6), align 2285; CHECK-NEXT: [[TMP12:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 8), align 8286; CHECK-NEXT: [[TMP13:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 8), align 8287; CHECK-NEXT: [[TMP14:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP12]], half [[TMP13]])288; CHECK-NEXT: store half [[TMP14]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 8), align 8289; CHECK-NEXT: [[TMP15:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 10), align 2290; CHECK-NEXT: [[TMP16:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 10), align 2291; CHECK-NEXT: [[TMP17:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP15]], half [[TMP16]])292; CHECK-NEXT: store half [[TMP17]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 10), align 2293; CHECK-NEXT: [[TMP18:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 12), align 4294; CHECK-NEXT: [[TMP19:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 12), align 4295; CHECK-NEXT: [[TMP20:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP18]], half [[TMP19]])296; CHECK-NEXT: store half [[TMP20]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 12), align 4297; CHECK-NEXT: [[TMP21:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 14), align 2298; CHECK-NEXT: [[TMP22:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 14), align 2299; CHECK-NEXT: [[TMP23:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP21]], half [[TMP22]])300; CHECK-NEXT: store half [[TMP23]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 14), align 2301; CHECK-NEXT: [[TMP24:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16302; CHECK-NEXT: [[TMP25:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16303; CHECK-NEXT: [[TMP26:%.*]] = tail call half @llvm.minimumnum.f16(half [[TMP24]], half [[TMP25]])304; CHECK-NEXT: store half [[TMP26]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16305; CHECK-NEXT: ret void306;307entry:308 %input0_0 = load half, ptr @input1_f16, align 16309 %input0_1 = load half, ptr @input2_f16, align 16310 %output0 = tail call half @llvm.minimumnum.f16(half %input0_0, half %input0_1)311 store half %output0, ptr @output_f16, align 16312 %input1_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 2), align 2313 %input1_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 2), align 2314 %output1 = tail call half @llvm.minimumnum.f16(half %input1_1, half %input1_2)315 store half %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 2), align 2316 %input2_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 4), align 4317 %input2_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 4), align 4318 %output2 = tail call half @llvm.minimumnum.f16(half %input2_1, half %input2_2)319 store half %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 4), align 4320 %input3_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 6), align 2321 %input3_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 6), align 2322 %output3 = tail call half @llvm.minimumnum.f16(half %input3_1, half %input3_2)323 store half %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 6), align 2324 %input4_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 8), align 8325 %input4_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 8), align 8326 %output4 = tail call half @llvm.minimumnum.f16(half %input4_1, half %input4_2)327 store half %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 8), align 8328 %input5_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 10), align 2329 %input5_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 10), align 2330 %output5 = tail call half @llvm.minimumnum.f16(half %input5_1, half %input5_2)331 store half %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 10), align 2332 %input6_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 12), align 4333 %input6_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 12), align 4334 %output6 = tail call half @llvm.minimumnum.f16(half %input6_1, half %input6_2)335 store half %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 12), align 4336 %input7_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 14), align 2337 %input7_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 14), align 2338 %output7 = tail call half @llvm.minimumnum.f16(half %input7_1, half %input7_2)339 store half %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 14), align 2340 %input8_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16341 %input8_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16342 %output8 = tail call half @llvm.minimumnum.f16(half %input8_1, half %input8_2)343 store half %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16344 ret void345}346 347declare half @llvm.minimumnum.f16(half, half)348 349define void @fmax16() {350; CHECK-LABEL: define void @fmax16() {351; CHECK-NEXT: [[ENTRY:.*:]]352; CHECK-NEXT: [[TMP0:%.*]] = load half, ptr @input1_f16, align 16353; CHECK-NEXT: [[TMP1:%.*]] = load half, ptr @input2_f16, align 16354; CHECK-NEXT: [[TMP2:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP0]], half [[TMP1]])355; CHECK-NEXT: store half [[TMP2]], ptr @output_f16, align 16356; CHECK-NEXT: [[TMP3:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 2), align 2357; CHECK-NEXT: [[TMP4:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 2), align 2358; CHECK-NEXT: [[TMP5:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP3]], half [[TMP4]])359; CHECK-NEXT: store half [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 2), align 2360; CHECK-NEXT: [[TMP6:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 4), align 4361; CHECK-NEXT: [[TMP7:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 4), align 4362; CHECK-NEXT: [[TMP8:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP6]], half [[TMP7]])363; CHECK-NEXT: store half [[TMP8]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 4), align 4364; CHECK-NEXT: [[TMP9:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 6), align 2365; CHECK-NEXT: [[TMP10:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 6), align 2366; CHECK-NEXT: [[TMP11:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP9]], half [[TMP10]])367; CHECK-NEXT: store half [[TMP11]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 6), align 2368; CHECK-NEXT: [[TMP12:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 8), align 8369; CHECK-NEXT: [[TMP13:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 8), align 8370; CHECK-NEXT: [[TMP14:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP12]], half [[TMP13]])371; CHECK-NEXT: store half [[TMP14]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 8), align 8372; CHECK-NEXT: [[TMP15:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 10), align 2373; CHECK-NEXT: [[TMP16:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 10), align 2374; CHECK-NEXT: [[TMP17:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP15]], half [[TMP16]])375; CHECK-NEXT: store half [[TMP17]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 10), align 2376; CHECK-NEXT: [[TMP18:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 12), align 4377; CHECK-NEXT: [[TMP19:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 12), align 4378; CHECK-NEXT: [[TMP20:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP18]], half [[TMP19]])379; CHECK-NEXT: store half [[TMP20]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 12), align 4380; CHECK-NEXT: [[TMP21:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 14), align 2381; CHECK-NEXT: [[TMP22:%.*]] = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 14), align 2382; CHECK-NEXT: [[TMP23:%.*]] = tail call half @llvm.maximumnum.f16(half [[TMP21]], half [[TMP22]])383; CHECK-NEXT: store half [[TMP23]], ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 14), align 2384; 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;390entry:391 %input0_0 = load half, ptr @input1_f16, align 16392 %input0_1 = load half, ptr @input2_f16, align 16393 %output0 = tail call half @llvm.maximumnum.f16(half %input0_0, half %input0_1)394 store half %output0, ptr @output_f16, align 16395 %input1_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 2), align 2396 %input1_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 2), align 2397 %output1 = tail call half @llvm.maximumnum.f16(half %input1_1, half %input1_2)398 store half %output1, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 2), align 2399 %input2_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 4), align 4400 %input2_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 4), align 4401 %output2 = tail call half @llvm.maximumnum.f16(half %input2_1, half %input2_2)402 store half %output2, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 4), align 4403 %input3_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 6), align 2404 %input3_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 6), align 2405 %output3 = tail call half @llvm.maximumnum.f16(half %input3_1, half %input3_2)406 store half %output3, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 6), align 2407 %input4_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 8), align 8408 %input4_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 8), align 8409 %output4 = tail call half @llvm.maximumnum.f16(half %input4_1, half %input4_2)410 store half %output4, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 8), align 8411 %input5_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 10), align 2412 %input5_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 10), align 2413 %output5 = tail call half @llvm.maximumnum.f16(half %input5_1, half %input5_2)414 store half %output5, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 10), align 2415 %input6_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 12), align 4416 %input6_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 12), align 4417 %output6 = tail call half @llvm.maximumnum.f16(half %input6_1, half %input6_2)418 store half %output6, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 12), align 4419 %input7_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 14), align 2420 %input7_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 14), align 2421 %output7 = tail call half @llvm.maximumnum.f16(half %input7_1, half %input7_2)422 store half %output7, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 14), align 2423 %input8_1 = load half, ptr getelementptr inbounds nuw (i8, ptr @input1_f16, i64 16), align 16424 %input8_2 = load half, ptr getelementptr inbounds nuw (i8, ptr @input2_f16, i64 16), align 16425 %output8 = tail call half @llvm.maximumnum.f16(half %input8_1, half %input8_2)426 store half %output8, ptr getelementptr inbounds nuw (i8, ptr @output_f16, i64 16), align 16427 ret void428}429 430declare half @llvm.maximumnum.f16(half, half)431