https://llvm.org/bugs/show_bug.cgi?id=27881
Bug ID: 27881 Summary: Code explosion when LoopVectorize vectorizes a loop with a stride of 8 floats, part 2 Product: libraries Version: trunk Hardware: PC OS: All Status: NEW Severity: normal Priority: P Component: Loop Optimizer Assignee: unassignedb...@nondot.org Reporter: spatel+l...@rotateright.com CC: llvm-bugs@lists.llvm.org Classification: Unclassified To show how fragile the fix for bug 27826 was, let's +1 that example: float foo(float *a, float *b, int n) { if (n % 8 != 0) __builtin_unreachable(); float s = 0; for (int i=0; i<n; i+=8) s += (a[i] + b[i] + 1.0f); // one more fadd to tip the cost scale return s; } ---------------------------------------------------------------------------- Or as IR input for 'opt -loop-vectorize': target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.11.0" define float @foo(float* %a, float* %b, i32 %n) { entry: %cmp113 = icmp sgt i32 %n, 0 br i1 %cmp113, label %for.body.preheader, label %for.cond.cleanup for.body.preheader: %t0 = sext i32 %n to i64 br label %for.body for.cond.cleanup: %s.0.lcssa = phi float [ 0.0, %entry ], [ %add5, %for.body ] ret float %s.0.lcssa for.body: %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] %s = phi float [ 0.0, %for.body.preheader ], [ %add5, %for.body ] %arrayidx = getelementptr inbounds float, float* %a, i64 %indvars.iv %t1 = load float, float* %arrayidx, align 4 %arrayidx3 = getelementptr inbounds float, float* %b, i64 %indvars.iv %t2 = load float, float* %arrayidx3, align 4 %add = fadd fast float %s, 1.0 %add4 = fadd fast float %add, %t1 %add5 = fadd fast float %add4, %t2 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 8 %cmp1 = icmp slt i64 %indvars.iv.next, %t0 br i1 %cmp1, label %for.body, label %for.cond.cleanup } ---------------------------------------------------------------------------- Ready. Set. BOOM! $ ./opt -loop-vectorize explode.ll -S -mattr=avx ; ModuleID = 'explode.ll' source_filename = "explode.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.11.0" define float @foo(float* %a, float* %b, i32 %n) #0 { entry: %cmp113 = icmp sgt i32 %n, 0 br i1 %cmp113, label %for.body.preheader, label %for.cond.cleanup for.body.preheader: ; preds = %entry %t0 = sext i32 %n to i64 %0 = add i64 %t0, -1 %1 = lshr i64 %0, 3 %2 = add i64 %1, 1 %min.iters.check = icmp ult i64 %2, 32 br i1 %min.iters.check, label %scalar.ph, label %min.iters.checked min.iters.checked: ; preds = %for.body.preheader %n.mod.vf = urem i64 %2, 32 %n.vec = sub i64 %2, %n.mod.vf %cmp.zero = icmp eq i64 %n.vec, 0 %ind.end = shl i64 %n.vec, 3 br i1 %cmp.zero, label %scalar.ph, label %vector.ph vector.ph: ; preds = %min.iters.checked %broadcast.splatinsert7 = insertelement <8 x i64> undef, i64 %t0, i32 0 %broadcast.splat8 = shufflevector <8 x i64> %broadcast.splatinsert7, <8 x i64> undef, <8 x i32> zeroinitializer br label %vector.body vector.body: ; preds = %vector.body, %vector.ph %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] %vec.phi = phi <8 x float> [ zeroinitializer, %vector.ph ], [ %363, %vector.body ] %vec.phi4 = phi <8 x float> [ zeroinitializer, %vector.ph ], [ %364, %vector.body ] %vec.phi5 = phi <8 x float> [ zeroinitializer, %vector.ph ], [ %365, %vector.body ] %vec.phi6 = phi <8 x float> [ zeroinitializer, %vector.ph ], [ %366, %vector.body ] %offset.idx = shl i64 %index, 3 %broadcast.splatinsert = insertelement <8 x i64> undef, i64 %offset.idx, i32 0 %broadcast.splat = shufflevector <8 x i64> %broadcast.splatinsert, <8 x i64> undef, <8 x i32> zeroinitializer %induction = add <8 x i64> %broadcast.splat, <i64 0, i64 8, i64 16, i64 24, i64 32, i64 40, i64 48, i64 56> %induction1 = add <8 x i64> %broadcast.splat, <i64 64, i64 72, i64 80, i64 88, i64 96, i64 104, i64 112, i64 120> %induction2 = add <8 x i64> %broadcast.splat, <i64 128, i64 136, i64 144, i64 152, i64 160, i64 168, i64 176, i64 184> %induction3 = add <8 x i64> %broadcast.splat, <i64 192, i64 200, i64 208, i64 216, i64 224, i64 232, i64 240, i64 248> %3 = extractelement <8 x i64> %induction, i32 0 %4 = getelementptr inbounds float, float* %a, i64 %3 %5 = insertelement <8 x float*> undef, float* %4, i32 0 %6 = extractelement <8 x i64> %induction, i32 1 %7 = getelementptr inbounds float, float* %a, i64 %6 %8 = insertelement <8 x float*> %5, float* %7, i32 1 %9 = extractelement <8 x i64> %induction, i32 2 %10 = getelementptr inbounds float, float* %a, i64 %9 %11 = insertelement <8 x float*> %8, float* %10, i32 2 %12 = extractelement <8 x i64> %induction, i32 3 %13 = getelementptr inbounds float, float* %a, i64 %12 %14 = insertelement <8 x float*> %11, float* %13, i32 3 %15 = extractelement <8 x i64> %induction, i32 4 %16 = getelementptr inbounds float, float* %a, i64 %15 %17 = insertelement <8 x float*> %14, float* %16, i32 4 %18 = extractelement <8 x i64> %induction, i32 5 %19 = getelementptr inbounds float, float* %a, i64 %18 %20 = insertelement <8 x float*> %17, float* %19, i32 5 %21 = extractelement <8 x i64> %induction, i32 6 %22 = getelementptr inbounds float, float* %a, i64 %21 %23 = insertelement <8 x float*> %20, float* %22, i32 6 %24 = extractelement <8 x i64> %induction, i32 7 %25 = getelementptr inbounds float, float* %a, i64 %24 %26 = insertelement <8 x float*> %23, float* %25, i32 7 %27 = extractelement <8 x i64> %induction1, i32 0 %28 = getelementptr inbounds float, float* %a, i64 %27 %29 = insertelement <8 x float*> undef, float* %28, i32 0 %30 = extractelement <8 x i64> %induction1, i32 1 %31 = getelementptr inbounds float, float* %a, i64 %30 %32 = insertelement <8 x float*> %29, float* %31, i32 1 %33 = extractelement <8 x i64> %induction1, i32 2 %34 = getelementptr inbounds float, float* %a, i64 %33 %35 = insertelement <8 x float*> %32, float* %34, i32 2 %36 = extractelement <8 x i64> %induction1, i32 3 %37 = getelementptr inbounds float, float* %a, i64 %36 %38 = insertelement <8 x float*> %35, float* %37, i32 3 %39 = extractelement <8 x i64> %induction1, i32 4 %40 = getelementptr inbounds float, float* %a, i64 %39 %41 = insertelement <8 x float*> %38, float* %40, i32 4 %42 = extractelement <8 x i64> %induction1, i32 5 %43 = getelementptr inbounds float, float* %a, i64 %42 %44 = insertelement <8 x float*> %41, float* %43, i32 5 %45 = extractelement <8 x i64> %induction1, i32 6 %46 = getelementptr inbounds float, float* %a, i64 %45 %47 = insertelement <8 x float*> %44, float* %46, i32 6 %48 = extractelement <8 x i64> %induction1, i32 7 %49 = getelementptr inbounds float, float* %a, i64 %48 %50 = insertelement <8 x float*> %47, float* %49, i32 7 %51 = extractelement <8 x i64> %induction2, i32 0 %52 = getelementptr inbounds float, float* %a, i64 %51 %53 = insertelement <8 x float*> undef, float* %52, i32 0 %54 = extractelement <8 x i64> %induction2, i32 1 %55 = getelementptr inbounds float, float* %a, i64 %54 %56 = insertelement <8 x float*> %53, float* %55, i32 1 %57 = extractelement <8 x i64> %induction2, i32 2 %58 = getelementptr inbounds float, float* %a, i64 %57 %59 = insertelement <8 x float*> %56, float* %58, i32 2 %60 = extractelement <8 x i64> %induction2, i32 3 %61 = getelementptr inbounds float, float* %a, i64 %60 %62 = insertelement <8 x float*> %59, float* %61, i32 3 %63 = extractelement <8 x i64> %induction2, i32 4 %64 = getelementptr inbounds float, float* %a, i64 %63 %65 = insertelement <8 x float*> %62, float* %64, i32 4 %66 = extractelement <8 x i64> %induction2, i32 5 %67 = getelementptr inbounds float, float* %a, i64 %66 %68 = insertelement <8 x float*> %65, float* %67, i32 5 %69 = extractelement <8 x i64> %induction2, i32 6 %70 = getelementptr inbounds float, float* %a, i64 %69 %71 = insertelement <8 x float*> %68, float* %70, i32 6 %72 = extractelement <8 x i64> %induction2, i32 7 %73 = getelementptr inbounds float, float* %a, i64 %72 %74 = insertelement <8 x float*> %71, float* %73, i32 7 %75 = extractelement <8 x i64> %induction3, i32 0 %76 = getelementptr inbounds float, float* %a, i64 %75 %77 = insertelement <8 x float*> undef, float* %76, i32 0 %78 = extractelement <8 x i64> %induction3, i32 1 %79 = getelementptr inbounds float, float* %a, i64 %78 %80 = insertelement <8 x float*> %77, float* %79, i32 1 %81 = extractelement <8 x i64> %induction3, i32 2 %82 = getelementptr inbounds float, float* %a, i64 %81 %83 = insertelement <8 x float*> %80, float* %82, i32 2 %84 = extractelement <8 x i64> %induction3, i32 3 %85 = getelementptr inbounds float, float* %a, i64 %84 %86 = insertelement <8 x float*> %83, float* %85, i32 3 %87 = extractelement <8 x i64> %induction3, i32 4 %88 = getelementptr inbounds float, float* %a, i64 %87 %89 = insertelement <8 x float*> %86, float* %88, i32 4 %90 = extractelement <8 x i64> %induction3, i32 5 %91 = getelementptr inbounds float, float* %a, i64 %90 %92 = insertelement <8 x float*> %89, float* %91, i32 5 %93 = extractelement <8 x i64> %induction3, i32 6 %94 = getelementptr inbounds float, float* %a, i64 %93 %95 = insertelement <8 x float*> %92, float* %94, i32 6 %96 = extractelement <8 x i64> %induction3, i32 7 %97 = getelementptr inbounds float, float* %a, i64 %96 %98 = insertelement <8 x float*> %95, float* %97, i32 7 %99 = extractelement <8 x float*> %26, i32 0 %100 = load float, float* %99, align 4 %101 = insertelement <8 x float> undef, float %100, i32 0 %102 = extractelement <8 x float*> %26, i32 1 %103 = load float, float* %102, align 4 %104 = insertelement <8 x float> %101, float %103, i32 1 %105 = extractelement <8 x float*> %26, i32 2 %106 = load float, float* %105, align 4 %107 = insertelement <8 x float> %104, float %106, i32 2 %108 = extractelement <8 x float*> %26, i32 3 %109 = load float, float* %108, align 4 %110 = insertelement <8 x float> %107, float %109, i32 3 %111 = extractelement <8 x float*> %26, i32 4 %112 = load float, float* %111, align 4 %113 = insertelement <8 x float> %110, float %112, i32 4 %114 = extractelement <8 x float*> %26, i32 5 %115 = load float, float* %114, align 4 %116 = insertelement <8 x float> %113, float %115, i32 5 %117 = extractelement <8 x float*> %26, i32 6 %118 = load float, float* %117, align 4 %119 = insertelement <8 x float> %116, float %118, i32 6 %120 = extractelement <8 x float*> %26, i32 7 %121 = load float, float* %120, align 4 %122 = insertelement <8 x float> %119, float %121, i32 7 %123 = extractelement <8 x float*> %50, i32 0 %124 = load float, float* %123, align 4 %125 = insertelement <8 x float> undef, float %124, i32 0 %126 = extractelement <8 x float*> %50, i32 1 %127 = load float, float* %126, align 4 %128 = insertelement <8 x float> %125, float %127, i32 1 %129 = extractelement <8 x float*> %50, i32 2 %130 = load float, float* %129, align 4 %131 = insertelement <8 x float> %128, float %130, i32 2 %132 = extractelement <8 x float*> %50, i32 3 %133 = load float, float* %132, align 4 %134 = insertelement <8 x float> %131, float %133, i32 3 %135 = extractelement <8 x float*> %50, i32 4 %136 = load float, float* %135, align 4 %137 = insertelement <8 x float> %134, float %136, i32 4 %138 = extractelement <8 x float*> %50, i32 5 %139 = load float, float* %138, align 4 %140 = insertelement <8 x float> %137, float %139, i32 5 %141 = extractelement <8 x float*> %50, i32 6 %142 = load float, float* %141, align 4 %143 = insertelement <8 x float> %140, float %142, i32 6 %144 = extractelement <8 x float*> %50, i32 7 %145 = load float, float* %144, align 4 %146 = insertelement <8 x float> %143, float %145, i32 7 %147 = extractelement <8 x float*> %74, i32 0 %148 = load float, float* %147, align 4 %149 = insertelement <8 x float> undef, float %148, i32 0 %150 = extractelement <8 x float*> %74, i32 1 %151 = load float, float* %150, align 4 %152 = insertelement <8 x float> %149, float %151, i32 1 %153 = extractelement <8 x float*> %74, i32 2 %154 = load float, float* %153, align 4 %155 = insertelement <8 x float> %152, float %154, i32 2 %156 = extractelement <8 x float*> %74, i32 3 %157 = load float, float* %156, align 4 %158 = insertelement <8 x float> %155, float %157, i32 3 %159 = extractelement <8 x float*> %74, i32 4 %160 = load float, float* %159, align 4 %161 = insertelement <8 x float> %158, float %160, i32 4 %162 = extractelement <8 x float*> %74, i32 5 %163 = load float, float* %162, align 4 %164 = insertelement <8 x float> %161, float %163, i32 5 %165 = extractelement <8 x float*> %74, i32 6 %166 = load float, float* %165, align 4 %167 = insertelement <8 x float> %164, float %166, i32 6 %168 = extractelement <8 x float*> %74, i32 7 %169 = load float, float* %168, align 4 %170 = insertelement <8 x float> %167, float %169, i32 7 %171 = extractelement <8 x float*> %98, i32 0 %172 = load float, float* %171, align 4 %173 = insertelement <8 x float> undef, float %172, i32 0 %174 = extractelement <8 x float*> %98, i32 1 %175 = load float, float* %174, align 4 %176 = insertelement <8 x float> %173, float %175, i32 1 %177 = extractelement <8 x float*> %98, i32 2 %178 = load float, float* %177, align 4 %179 = insertelement <8 x float> %176, float %178, i32 2 %180 = extractelement <8 x float*> %98, i32 3 %181 = load float, float* %180, align 4 %182 = insertelement <8 x float> %179, float %181, i32 3 %183 = extractelement <8 x float*> %98, i32 4 %184 = load float, float* %183, align 4 %185 = insertelement <8 x float> %182, float %184, i32 4 %186 = extractelement <8 x float*> %98, i32 5 %187 = load float, float* %186, align 4 %188 = insertelement <8 x float> %185, float %187, i32 5 %189 = extractelement <8 x float*> %98, i32 6 %190 = load float, float* %189, align 4 %191 = insertelement <8 x float> %188, float %190, i32 6 %192 = extractelement <8 x float*> %98, i32 7 %193 = load float, float* %192, align 4 %194 = insertelement <8 x float> %191, float %193, i32 7 %195 = getelementptr inbounds float, float* %b, i64 %3 %196 = insertelement <8 x float*> undef, float* %195, i32 0 %197 = getelementptr inbounds float, float* %b, i64 %6 %198 = insertelement <8 x float*> %196, float* %197, i32 1 %199 = getelementptr inbounds float, float* %b, i64 %9 %200 = insertelement <8 x float*> %198, float* %199, i32 2 %201 = getelementptr inbounds float, float* %b, i64 %12 %202 = insertelement <8 x float*> %200, float* %201, i32 3 %203 = getelementptr inbounds float, float* %b, i64 %15 %204 = insertelement <8 x float*> %202, float* %203, i32 4 %205 = getelementptr inbounds float, float* %b, i64 %18 %206 = insertelement <8 x float*> %204, float* %205, i32 5 %207 = getelementptr inbounds float, float* %b, i64 %21 %208 = insertelement <8 x float*> %206, float* %207, i32 6 %209 = getelementptr inbounds float, float* %b, i64 %24 %210 = insertelement <8 x float*> %208, float* %209, i32 7 %211 = getelementptr inbounds float, float* %b, i64 %27 %212 = insertelement <8 x float*> undef, float* %211, i32 0 %213 = getelementptr inbounds float, float* %b, i64 %30 %214 = insertelement <8 x float*> %212, float* %213, i32 1 %215 = getelementptr inbounds float, float* %b, i64 %33 %216 = insertelement <8 x float*> %214, float* %215, i32 2 %217 = getelementptr inbounds float, float* %b, i64 %36 %218 = insertelement <8 x float*> %216, float* %217, i32 3 %219 = getelementptr inbounds float, float* %b, i64 %39 %220 = insertelement <8 x float*> %218, float* %219, i32 4 %221 = getelementptr inbounds float, float* %b, i64 %42 %222 = insertelement <8 x float*> %220, float* %221, i32 5 %223 = getelementptr inbounds float, float* %b, i64 %45 %224 = insertelement <8 x float*> %222, float* %223, i32 6 %225 = getelementptr inbounds float, float* %b, i64 %48 %226 = insertelement <8 x float*> %224, float* %225, i32 7 %227 = getelementptr inbounds float, float* %b, i64 %51 %228 = insertelement <8 x float*> undef, float* %227, i32 0 %229 = getelementptr inbounds float, float* %b, i64 %54 %230 = insertelement <8 x float*> %228, float* %229, i32 1 %231 = getelementptr inbounds float, float* %b, i64 %57 %232 = insertelement <8 x float*> %230, float* %231, i32 2 %233 = getelementptr inbounds float, float* %b, i64 %60 %234 = insertelement <8 x float*> %232, float* %233, i32 3 %235 = getelementptr inbounds float, float* %b, i64 %63 %236 = insertelement <8 x float*> %234, float* %235, i32 4 %237 = getelementptr inbounds float, float* %b, i64 %66 %238 = insertelement <8 x float*> %236, float* %237, i32 5 %239 = getelementptr inbounds float, float* %b, i64 %69 %240 = insertelement <8 x float*> %238, float* %239, i32 6 %241 = getelementptr inbounds float, float* %b, i64 %72 %242 = insertelement <8 x float*> %240, float* %241, i32 7 %243 = getelementptr inbounds float, float* %b, i64 %75 %244 = insertelement <8 x float*> undef, float* %243, i32 0 %245 = getelementptr inbounds float, float* %b, i64 %78 %246 = insertelement <8 x float*> %244, float* %245, i32 1 %247 = getelementptr inbounds float, float* %b, i64 %81 %248 = insertelement <8 x float*> %246, float* %247, i32 2 %249 = getelementptr inbounds float, float* %b, i64 %84 %250 = insertelement <8 x float*> %248, float* %249, i32 3 %251 = getelementptr inbounds float, float* %b, i64 %87 %252 = insertelement <8 x float*> %250, float* %251, i32 4 %253 = getelementptr inbounds float, float* %b, i64 %90 %254 = insertelement <8 x float*> %252, float* %253, i32 5 %255 = getelementptr inbounds float, float* %b, i64 %93 %256 = insertelement <8 x float*> %254, float* %255, i32 6 %257 = getelementptr inbounds float, float* %b, i64 %96 %258 = insertelement <8 x float*> %256, float* %257, i32 7 %259 = extractelement <8 x float*> %210, i32 0 %260 = load float, float* %259, align 4 %261 = insertelement <8 x float> undef, float %260, i32 0 %262 = extractelement <8 x float*> %210, i32 1 %263 = load float, float* %262, align 4 %264 = insertelement <8 x float> %261, float %263, i32 1 %265 = extractelement <8 x float*> %210, i32 2 %266 = load float, float* %265, align 4 %267 = insertelement <8 x float> %264, float %266, i32 2 %268 = extractelement <8 x float*> %210, i32 3 %269 = load float, float* %268, align 4 %270 = insertelement <8 x float> %267, float %269, i32 3 %271 = extractelement <8 x float*> %210, i32 4 %272 = load float, float* %271, align 4 %273 = insertelement <8 x float> %270, float %272, i32 4 %274 = extractelement <8 x float*> %210, i32 5 %275 = load float, float* %274, align 4 %276 = insertelement <8 x float> %273, float %275, i32 5 %277 = extractelement <8 x float*> %210, i32 6 %278 = load float, float* %277, align 4 %279 = insertelement <8 x float> %276, float %278, i32 6 %280 = extractelement <8 x float*> %210, i32 7 %281 = load float, float* %280, align 4 %282 = insertelement <8 x float> %279, float %281, i32 7 %283 = extractelement <8 x float*> %226, i32 0 %284 = load float, float* %283, align 4 %285 = insertelement <8 x float> undef, float %284, i32 0 %286 = extractelement <8 x float*> %226, i32 1 %287 = load float, float* %286, align 4 %288 = insertelement <8 x float> %285, float %287, i32 1 %289 = extractelement <8 x float*> %226, i32 2 %290 = load float, float* %289, align 4 %291 = insertelement <8 x float> %288, float %290, i32 2 %292 = extractelement <8 x float*> %226, i32 3 %293 = load float, float* %292, align 4 %294 = insertelement <8 x float> %291, float %293, i32 3 %295 = extractelement <8 x float*> %226, i32 4 %296 = load float, float* %295, align 4 %297 = insertelement <8 x float> %294, float %296, i32 4 %298 = extractelement <8 x float*> %226, i32 5 %299 = load float, float* %298, align 4 %300 = insertelement <8 x float> %297, float %299, i32 5 %301 = extractelement <8 x float*> %226, i32 6 %302 = load float, float* %301, align 4 %303 = insertelement <8 x float> %300, float %302, i32 6 %304 = extractelement <8 x float*> %226, i32 7 %305 = load float, float* %304, align 4 %306 = insertelement <8 x float> %303, float %305, i32 7 %307 = extractelement <8 x float*> %242, i32 0 %308 = load float, float* %307, align 4 %309 = insertelement <8 x float> undef, float %308, i32 0 %310 = extractelement <8 x float*> %242, i32 1 %311 = load float, float* %310, align 4 %312 = insertelement <8 x float> %309, float %311, i32 1 %313 = extractelement <8 x float*> %242, i32 2 %314 = load float, float* %313, align 4 %315 = insertelement <8 x float> %312, float %314, i32 2 %316 = extractelement <8 x float*> %242, i32 3 %317 = load float, float* %316, align 4 %318 = insertelement <8 x float> %315, float %317, i32 3 %319 = extractelement <8 x float*> %242, i32 4 %320 = load float, float* %319, align 4 %321 = insertelement <8 x float> %318, float %320, i32 4 %322 = extractelement <8 x float*> %242, i32 5 %323 = load float, float* %322, align 4 %324 = insertelement <8 x float> %321, float %323, i32 5 %325 = extractelement <8 x float*> %242, i32 6 %326 = load float, float* %325, align 4 %327 = insertelement <8 x float> %324, float %326, i32 6 %328 = extractelement <8 x float*> %242, i32 7 %329 = load float, float* %328, align 4 %330 = insertelement <8 x float> %327, float %329, i32 7 %331 = extractelement <8 x float*> %258, i32 0 %332 = load float, float* %331, align 4 %333 = insertelement <8 x float> undef, float %332, i32 0 %334 = extractelement <8 x float*> %258, i32 1 %335 = load float, float* %334, align 4 %336 = insertelement <8 x float> %333, float %335, i32 1 %337 = extractelement <8 x float*> %258, i32 2 %338 = load float, float* %337, align 4 %339 = insertelement <8 x float> %336, float %338, i32 2 %340 = extractelement <8 x float*> %258, i32 3 %341 = load float, float* %340, align 4 %342 = insertelement <8 x float> %339, float %341, i32 3 %343 = extractelement <8 x float*> %258, i32 4 %344 = load float, float* %343, align 4 %345 = insertelement <8 x float> %342, float %344, i32 4 %346 = extractelement <8 x float*> %258, i32 5 %347 = load float, float* %346, align 4 %348 = insertelement <8 x float> %345, float %347, i32 5 %349 = extractelement <8 x float*> %258, i32 6 %350 = load float, float* %349, align 4 %351 = insertelement <8 x float> %348, float %350, i32 6 %352 = extractelement <8 x float*> %258, i32 7 %353 = load float, float* %352, align 4 %354 = insertelement <8 x float> %351, float %353, i32 7 %355 = fadd fast <8 x float> %vec.phi, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> %356 = fadd fast <8 x float> %vec.phi4, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> %357 = fadd fast <8 x float> %vec.phi5, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> %358 = fadd fast <8 x float> %vec.phi6, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> %359 = fadd fast <8 x float> %355, %122 %360 = fadd fast <8 x float> %356, %146 %361 = fadd fast <8 x float> %357, %170 %362 = fadd fast <8 x float> %358, %194 %363 = fadd fast <8 x float> %359, %282 %364 = fadd fast <8 x float> %360, %306 %365 = fadd fast <8 x float> %361, %330 %366 = fadd fast <8 x float> %362, %354 %367 = add nuw nsw <8 x i64> %induction, <i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8> %368 = add nuw nsw <8 x i64> %induction1, <i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8> %369 = add nuw nsw <8 x i64> %induction2, <i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8> %370 = add nuw nsw <8 x i64> %induction3, <i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8> %371 = icmp slt <8 x i64> %367, %broadcast.splat8 %372 = icmp slt <8 x i64> %368, %broadcast.splat8 %373 = icmp slt <8 x i64> %369, %broadcast.splat8 %374 = icmp slt <8 x i64> %370, %broadcast.splat8 %index.next = add i64 %index, 32 %375 = icmp eq i64 %index.next, %n.vec br i1 %375, label %middle.block, label %vector.body, !llvm.loop !0 middle.block: ; preds = %vector.body %bin.rdx = fadd fast <8 x float> %364, %363 %bin.rdx9 = fadd fast <8 x float> %365, %bin.rdx %bin.rdx10 = fadd fast <8 x float> %366, %bin.rdx9 %rdx.shuf = shufflevector <8 x float> %bin.rdx10, <8 x float> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef> %bin.rdx11 = fadd fast <8 x float> %bin.rdx10, %rdx.shuf %rdx.shuf12 = shufflevector <8 x float> %bin.rdx11, <8 x float> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> %bin.rdx13 = fadd fast <8 x float> %bin.rdx11, %rdx.shuf12 %rdx.shuf14 = shufflevector <8 x float> %bin.rdx13, <8 x float> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> %bin.rdx15 = fadd fast <8 x float> %bin.rdx13, %rdx.shuf14 %376 = extractelement <8 x float> %bin.rdx15, i32 0 %cmp.n = icmp eq i64 %2, %n.vec br i1 %cmp.n, label %for.cond.cleanup.loopexit, label %scalar.ph scalar.ph: ; preds = %middle.block, %min.iters.checked, %for.body.preheader %bc.resume.val = phi i64 [ %ind.end, %middle.block ], [ 0, %for.body.preheader ], [ 0, %min.iters.checked ] %bc.merge.rdx = phi float [ 0.000000e+00, %for.body.preheader ], [ 0.000000e+00, %min.iters.checked ], [ %376, %middle.block ] br label %for.body for.cond.cleanup.loopexit: ; preds = %middle.block, %for.body %add5.lcssa = phi float [ %add5, %for.body ], [ %376, %middle.block ] br label %for.cond.cleanup for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry %s.0.lcssa = phi float [ 0.000000e+00, %entry ], [ %add5.lcssa, %for.cond.cleanup.loopexit ] ret float %s.0.lcssa for.body: ; preds = %for.body, %scalar.ph %indvars.iv = phi i64 [ %bc.resume.val, %scalar.ph ], [ %indvars.iv.next, %for.body ] %s = phi float [ %bc.merge.rdx, %scalar.ph ], [ %add5, %for.body ] %arrayidx = getelementptr inbounds float, float* %a, i64 %indvars.iv %t1 = load float, float* %arrayidx, align 4 %arrayidx3 = getelementptr inbounds float, float* %b, i64 %indvars.iv %t2 = load float, float* %arrayidx3, align 4 %add = fadd fast float %s, 1.000000e+00 %add4 = fadd fast float %add, %t1 %add5 = fadd fast float %add4, %t2 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 8 %cmp1 = icmp slt i64 %indvars.iv.next, %t0 br i1 %cmp1, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !3 } attributes #0 = { "target-features"="+avx" } !0 = distinct !{!0, !1, !2} !1 = !{!"llvm.loop.vectorize.width", i32 1} !2 = !{!"llvm.loop.interleave.count", i32 1} !3 = distinct !{!3, !4, !1, !2} !4 = !{!"llvm.loop.unroll.runtime.disable"} -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs