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