brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.0 KiB · 25aa24b Raw
254 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64--- -mattr=+sse2 | FileCheck %s3; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64--- -mattr=+avx  | FileCheck %s4 5;6; Check that we can commute operands based on the predicate.7;8 9define <4 x i32> @icmp_eq_v4i32(<4 x i32> %a, ptr %b) {10; CHECK-LABEL: @icmp_eq_v4i32(11; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[B:%.*]], align 412; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <4 x i32> [[TMP1]], [[A:%.*]]13; CHECK-NEXT:    [[R:%.*]] = sext <4 x i1> [[TMP2]] to <4 x i32>14; CHECK-NEXT:    ret <4 x i32> [[R]]15;16  %a0 = extractelement <4 x i32> %a, i32 017  %a1 = extractelement <4 x i32> %a, i32 118  %a2 = extractelement <4 x i32> %a, i32 219  %a3 = extractelement <4 x i32> %a, i32 320  %p1 = getelementptr inbounds i32, ptr %b, i32 121  %p2 = getelementptr inbounds i32, ptr %b, i32 222  %p3 = getelementptr inbounds i32, ptr %b, i32 323  %b0 = load i32, ptr %b, align 424  %b1 = load i32, ptr %p1, align 425  %b2 = load i32, ptr %p2, align 426  %b3 = load i32, ptr %p3, align 427  %c0 = icmp eq i32 %a0, %b028  %c1 = icmp eq i32 %b1, %a129  %c2 = icmp eq i32 %b2, %a230  %c3 = icmp eq i32 %a3, %b331  %d0 = insertelement <4 x i1> undef, i1 %c0, i32 032  %d1 = insertelement <4 x i1>   %d0, i1 %c1, i32 133  %d2 = insertelement <4 x i1>   %d1, i1 %c2, i32 234  %d3 = insertelement <4 x i1>   %d2, i1 %c3, i32 335  %r = sext <4 x i1> %d3 to <4 x i32>36  ret <4 x i32> %r37}38 39define <4 x i32> @icmp_ne_v4i32(<4 x i32> %a, ptr %b) {40; CHECK-LABEL: @icmp_ne_v4i32(41; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[B:%.*]], align 442; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne <4 x i32> [[TMP1]], [[A:%.*]]43; CHECK-NEXT:    [[R:%.*]] = sext <4 x i1> [[TMP2]] to <4 x i32>44; CHECK-NEXT:    ret <4 x i32> [[R]]45;46  %a0 = extractelement <4 x i32> %a, i32 047  %a1 = extractelement <4 x i32> %a, i32 148  %a2 = extractelement <4 x i32> %a, i32 249  %a3 = extractelement <4 x i32> %a, i32 350  %p1 = getelementptr inbounds i32, ptr %b, i32 151  %p2 = getelementptr inbounds i32, ptr %b, i32 252  %p3 = getelementptr inbounds i32, ptr %b, i32 353  %b0 = load i32, ptr %b, align 454  %b1 = load i32, ptr %p1, align 455  %b2 = load i32, ptr %p2, align 456  %b3 = load i32, ptr %p3, align 457  %c0 = icmp ne i32 %a0, %b058  %c1 = icmp ne i32 %b1, %a159  %c2 = icmp ne i32 %b2, %a260  %c3 = icmp ne i32 %a3, %b361  %d0 = insertelement <4 x i1> undef, i1 %c0, i32 062  %d1 = insertelement <4 x i1>   %d0, i1 %c1, i32 163  %d2 = insertelement <4 x i1>   %d1, i1 %c2, i32 264  %d3 = insertelement <4 x i1>   %d2, i1 %c3, i32 365  %r = sext <4 x i1> %d3 to <4 x i32>66  ret <4 x i32> %r67}68 69define <4 x i32> @fcmp_oeq_v4i32(<4 x float> %a, ptr %b) {70; CHECK-LABEL: @fcmp_oeq_v4i32(71; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[B:%.*]], align 472; CHECK-NEXT:    [[TMP2:%.*]] = fcmp oeq <4 x float> [[TMP1]], [[A:%.*]]73; CHECK-NEXT:    [[R:%.*]] = sext <4 x i1> [[TMP2]] to <4 x i32>74; CHECK-NEXT:    ret <4 x i32> [[R]]75;76  %a0 = extractelement <4 x float> %a, i32 077  %a1 = extractelement <4 x float> %a, i32 178  %a2 = extractelement <4 x float> %a, i32 279  %a3 = extractelement <4 x float> %a, i32 380  %p1 = getelementptr inbounds float, ptr %b, i32 181  %p2 = getelementptr inbounds float, ptr %b, i32 282  %p3 = getelementptr inbounds float, ptr %b, i32 383  %b0 = load float, ptr %b, align 484  %b1 = load float, ptr %p1, align 485  %b2 = load float, ptr %p2, align 486  %b3 = load float, ptr %p3, align 487  %c0 = fcmp oeq float %a0, %b088  %c1 = fcmp oeq float %b1, %a189  %c2 = fcmp oeq float %b2, %a290  %c3 = fcmp oeq float %a3, %b391  %d0 = insertelement <4 x i1> undef, i1 %c0, i32 092  %d1 = insertelement <4 x i1>   %d0, i1 %c1, i32 193  %d2 = insertelement <4 x i1>   %d1, i1 %c2, i32 294  %d3 = insertelement <4 x i1>   %d2, i1 %c3, i32 395  %r = sext <4 x i1> %d3 to <4 x i32>96  ret <4 x i32> %r97}98 99define <4 x i32> @fcmp_uno_v4i32(<4 x float> %a, ptr %b) {100; CHECK-LABEL: @fcmp_uno_v4i32(101; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[B:%.*]], align 4102; CHECK-NEXT:    [[TMP2:%.*]] = fcmp uno <4 x float> [[TMP1]], [[A:%.*]]103; CHECK-NEXT:    [[R:%.*]] = sext <4 x i1> [[TMP2]] to <4 x i32>104; CHECK-NEXT:    ret <4 x i32> [[R]]105;106  %a0 = extractelement <4 x float> %a, i32 0107  %a1 = extractelement <4 x float> %a, i32 1108  %a2 = extractelement <4 x float> %a, i32 2109  %a3 = extractelement <4 x float> %a, i32 3110  %p1 = getelementptr inbounds float, ptr %b, i32 1111  %p2 = getelementptr inbounds float, ptr %b, i32 2112  %p3 = getelementptr inbounds float, ptr %b, i32 3113  %b0 = load float, ptr %b, align 4114  %b1 = load float, ptr %p1, align 4115  %b2 = load float, ptr %p2, align 4116  %b3 = load float, ptr %p3, align 4117  %c0 = fcmp uno float %a0, %b0118  %c1 = fcmp uno float %b1, %a1119  %c2 = fcmp uno float %b2, %a2120  %c3 = fcmp uno float %a3, %b3121  %d0 = insertelement <4 x i1> undef, i1 %c0, i32 0122  %d1 = insertelement <4 x i1>   %d0, i1 %c1, i32 1123  %d2 = insertelement <4 x i1>   %d1, i1 %c2, i32 2124  %d3 = insertelement <4 x i1>   %d2, i1 %c3, i32 3125  %r = sext <4 x i1> %d3 to <4 x i32>126  ret <4 x i32> %r127}128 129;130; Check that we can commute operands by swapping the predicate.131;132 133define <4 x i32> @icmp_sgt_slt_v4i32(<4 x i32> %a, ptr %b) {134; CHECK-LABEL: @icmp_sgt_slt_v4i32(135; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[B:%.*]], align 4136; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <4 x i32> [[A:%.*]], [[TMP1]]137; CHECK-NEXT:    [[R:%.*]] = sext <4 x i1> [[TMP2]] to <4 x i32>138; CHECK-NEXT:    ret <4 x i32> [[R]]139;140  %a0 = extractelement <4 x i32> %a, i32 0141  %a1 = extractelement <4 x i32> %a, i32 1142  %a2 = extractelement <4 x i32> %a, i32 2143  %a3 = extractelement <4 x i32> %a, i32 3144  %p1 = getelementptr inbounds i32, ptr %b, i32 1145  %p2 = getelementptr inbounds i32, ptr %b, i32 2146  %p3 = getelementptr inbounds i32, ptr %b, i32 3147  %b0 = load i32, ptr %b, align 4148  %b1 = load i32, ptr %p1, align 4149  %b2 = load i32, ptr %p2, align 4150  %b3 = load i32, ptr %p3, align 4151  %c0 = icmp sgt i32 %a0, %b0152  %c1 = icmp slt i32 %b1, %a1153  %c2 = icmp slt i32 %b2, %a2154  %c3 = icmp sgt i32 %a3, %b3155  %d0 = insertelement <4 x i1> undef, i1 %c0, i32 0156  %d1 = insertelement <4 x i1>   %d0, i1 %c1, i32 1157  %d2 = insertelement <4 x i1>   %d1, i1 %c2, i32 2158  %d3 = insertelement <4 x i1>   %d2, i1 %c3, i32 3159  %r = sext <4 x i1> %d3 to <4 x i32>160  ret <4 x i32> %r161}162 163define <4 x i32> @icmp_uge_ule_v4i32(<4 x i32> %a, ptr %b) {164; CHECK-LABEL: @icmp_uge_ule_v4i32(165; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[B:%.*]], align 4166; CHECK-NEXT:    [[TMP2:%.*]] = icmp uge <4 x i32> [[A:%.*]], [[TMP1]]167; CHECK-NEXT:    [[R:%.*]] = sext <4 x i1> [[TMP2]] to <4 x i32>168; CHECK-NEXT:    ret <4 x i32> [[R]]169;170  %a0 = extractelement <4 x i32> %a, i32 0171  %a1 = extractelement <4 x i32> %a, i32 1172  %a2 = extractelement <4 x i32> %a, i32 2173  %a3 = extractelement <4 x i32> %a, i32 3174  %p1 = getelementptr inbounds i32, ptr %b, i32 1175  %p2 = getelementptr inbounds i32, ptr %b, i32 2176  %p3 = getelementptr inbounds i32, ptr %b, i32 3177  %b0 = load i32, ptr %b, align 4178  %b1 = load i32, ptr %p1, align 4179  %b2 = load i32, ptr %p2, align 4180  %b3 = load i32, ptr %p3, align 4181  %c0 = icmp uge i32 %a0, %b0182  %c1 = icmp ule i32 %b1, %a1183  %c2 = icmp ule i32 %b2, %a2184  %c3 = icmp uge i32 %a3, %b3185  %d0 = insertelement <4 x i1> undef, i1 %c0, i32 0186  %d1 = insertelement <4 x i1>   %d0, i1 %c1, i32 1187  %d2 = insertelement <4 x i1>   %d1, i1 %c2, i32 2188  %d3 = insertelement <4 x i1>   %d2, i1 %c3, i32 3189  %r = sext <4 x i1> %d3 to <4 x i32>190  ret <4 x i32> %r191}192 193define <4 x i32> @fcmp_ogt_olt_v4i32(<4 x float> %a, ptr %b) {194; CHECK-LABEL: @fcmp_ogt_olt_v4i32(195; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[B:%.*]], align 4196; CHECK-NEXT:    [[TMP2:%.*]] = fcmp ogt <4 x float> [[A:%.*]], [[TMP1]]197; CHECK-NEXT:    [[R:%.*]] = sext <4 x i1> [[TMP2]] to <4 x i32>198; CHECK-NEXT:    ret <4 x i32> [[R]]199;200  %a0 = extractelement <4 x float> %a, i32 0201  %a1 = extractelement <4 x float> %a, i32 1202  %a2 = extractelement <4 x float> %a, i32 2203  %a3 = extractelement <4 x float> %a, i32 3204  %p1 = getelementptr inbounds float, ptr %b, i32 1205  %p2 = getelementptr inbounds float, ptr %b, i32 2206  %p3 = getelementptr inbounds float, ptr %b, i32 3207  %b0 = load float, ptr %b, align 4208  %b1 = load float, ptr %p1, align 4209  %b2 = load float, ptr %p2, align 4210  %b3 = load float, ptr %p3, align 4211  %c0 = fcmp ogt float %a0, %b0212  %c1 = fcmp olt float %b1, %a1213  %c2 = fcmp olt float %b2, %a2214  %c3 = fcmp ogt float %a3, %b3215  %d0 = insertelement <4 x i1> undef, i1 %c0, i32 0216  %d1 = insertelement <4 x i1>   %d0, i1 %c1, i32 1217  %d2 = insertelement <4 x i1>   %d1, i1 %c2, i32 2218  %d3 = insertelement <4 x i1>   %d2, i1 %c3, i32 3219  %r = sext <4 x i1> %d3 to <4 x i32>220  ret <4 x i32> %r221}222 223define <4 x i32> @fcmp_ord_uno_v4i32(<4 x float> %a, ptr %b) {224; CHECK-LABEL: @fcmp_ord_uno_v4i32(225; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[B:%.*]], align 4226; CHECK-NEXT:    [[TMP2:%.*]] = fcmp ord <4 x float> [[TMP1]], [[A:%.*]]227; CHECK-NEXT:    [[TMP3:%.*]] = fcmp uno <4 x float> [[TMP1]], [[A]]228; CHECK-NEXT:    [[TMP4:%.*]] = shufflevector <4 x i1> [[TMP2]], <4 x i1> [[TMP3]], <4 x i32> <i32 0, i32 5, i32 6, i32 3>229; CHECK-NEXT:    [[R:%.*]] = sext <4 x i1> [[TMP4]] to <4 x i32>230; CHECK-NEXT:    ret <4 x i32> [[R]]231;232  %a0 = extractelement <4 x float> %a, i32 0233  %a1 = extractelement <4 x float> %a, i32 1234  %a2 = extractelement <4 x float> %a, i32 2235  %a3 = extractelement <4 x float> %a, i32 3236  %p1 = getelementptr inbounds float, ptr %b, i32 1237  %p2 = getelementptr inbounds float, ptr %b, i32 2238  %p3 = getelementptr inbounds float, ptr %b, i32 3239  %b0 = load float, ptr %b, align 4240  %b1 = load float, ptr %p1, align 4241  %b2 = load float, ptr %p2, align 4242  %b3 = load float, ptr %p3, align 4243  %c0 = fcmp ord float %a0, %b0244  %c1 = fcmp uno float %b1, %a1245  %c2 = fcmp uno float %b2, %a2246  %c3 = fcmp ord float %a3, %b3247  %d0 = insertelement <4 x i1> undef, i1 %c0, i32 0248  %d1 = insertelement <4 x i1>   %d0, i1 %c1, i32 1249  %d2 = insertelement <4 x i1>   %d1, i1 %c2, i32 2250  %d3 = insertelement <4 x i1>   %d2, i1 %c3, i32 3251  %r = sext <4 x i1> %d3 to <4 x i32>252  ret <4 x i32> %r253}254