[llvm-bugs] [Bug 27881] New: Code explosion when LoopVectorize vectorizes a loop with a stride of 8 floats, part 2
via llvm-bugs
llvm-bugs at lists.llvm.org
Wed May 25 11:09:33 PDT 2016
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: unassignedbugs at nondot.org
Reporter: spatel+llvm at rotateright.com
CC: llvm-bugs at 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160525/4c5cf27c/attachment-0001.html>
More information about the llvm-bugs
mailing list