[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