[LLVMdev] scev questions
Redmond, Paul
paul.redmond at intel.com
Thu Aug 22 13:24:30 PDT 2013
Hi,
I'm trying to get the following loop to vectorize (simple reduction):
unsigned int sum2(unsigned int *a, int len){
unsigned int s = 0;
for (int i = 0; i < len; i += 4)
s += *a++;
return s;
}
The loop fails to vectorize because SCEV could not compute the loop exit
count. It appears SCEV cannot handle the non-unit increment of the loop
counter. Is this a known limitation of SCEV or is there something that can
be improved (and if so where should I start looking?)
Thanks,
Paul
Here's the IR for the loop and the SCEV dump:
for.body: ; preds =
%for.body.lr.ph, %for.body
%i.07 = phi i32 [ 0, %for.body.lr.ph ], [ %add1, %for.body ]
%s.06 = phi i32 [ 0, %for.body.lr.ph ], [ %add, %for.body ]
%a.addr.05 = phi i32* [ %a, %for.body.lr.ph ], [ %incdec.ptr, %for.body ]
%incdec.ptr = getelementptr inbounds i32* %a.addr.05, i64 1
%0 = load i32* %a.addr.05, align 4, !tbaa !0
%add = add i32 %0, %s.06
%add1 = add nsw i32 %i.07, 4
%cmp = icmp slt i32 %add1, %len
br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge
Classifying expressions for: @_Z4sum2Pji
%i.07 = phi i32 [ 0, %for.body.lr.ph ], [ %add1, %for.body ]
--> {0,+,4}<nuw><nsw><%for.body> Exits: <<Unknown>>
%s.06 = phi i32 [ 0, %for.body.lr.ph ], [ %add, %for.body ]
--> %s.06 Exits: <<Unknown>>
%a.addr.05 = phi i32* [ %a, %for.body.lr.ph ], [ %incdec.ptr, %for.body ]
--> {%a,+,4}<nw><%for.body> Exits: <<Unknown>>
%incdec.ptr = getelementptr inbounds i32* %a.addr.05, i64 1
--> {(4 + %a),+,4}<nw><%for.body> Exits: <<Unknown>>
%0 = load i32* %a.addr.05, align 4, !tbaa !0
--> %0 Exits: <<Unknown>>
%add = add i32 %0, %s.06
--> (%0 + %s.06) Exits: <<Unknown>>
%add1 = add nsw i32 %i.07, 4
--> {4,+,4}<nuw><nsw><%for.body> Exits: <<Unknown>>
%add.lcssa = phi i32 [ %add, %for.body ]
--> %add.lcssa
%s.0.lcssa = phi i32 [ %add.lcssa, %for.cond.for.end_crit_edge ], [ 0,
%entry ]
--> %s.0.lcssa
Determining loop execution counts for: @_Z4sum2Pji
Loop %for.body: Unpredictable backedge-taken count.
Loop %for.body: Unpredictable max backedge-taken count.
More information about the llvm-dev
mailing list