[LLVMdev] [PATCH] Teaching ScalarEvolution to handle IV=add(zext(trunc(IV)), Step)
Matthew Curtis
mcurtis at codeaurora.org
Mon Dec 17 04:46:59 PST 2012
Any ScalarEvolution experts out there have any thought about this patch?
Thanks,
Matthew Curtis.
On 12/10/2012 4:13 PM, Matthew Curtis wrote:
> Hello all,
>
> I wanted to get some feedback on this patch for ScalarEvolution.
>
> It addresses a performance problem I am seeing for simple benchmark.
>
> Starting with this C code:
>
> 01: signed char foo(void)
> 02: {
> 03: const int count = 8000;
> 04: signed char result = 0;
> 05: int j;
> 06:
> 07: for (j = 0; j < count; ++j) {
> 08: result += (result_t)(3);
> 09: }
> 10:
> 11: return result;
> 12: }
>
> I end up with this IR feeding into Induction Variable Simplification:
>
> 01: define signext i8 @foo() nounwind readnone {
> 02: entry:
> 03: br label %for.body
> 04:
> 05: for.body: ; preds =
> %entry, %for.body
> 06: %j.04 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
> 07: %result.03 = phi i32 [ 0, %entry ], [ %add, %for.body ]
> 08: %conv2 = and i32 %result.03, 255
> 09: %add = add nsw i32 %conv2, 3
> 10: %inc = add nsw i32 %j.04, 1
> 11: %cmp = icmp slt i32 %inc, 8000
> 12: br i1 %cmp, label %for.body, label %for.end
> 13:
> 14: for.end: ; preds = %for.body
> 15: %conv1 = trunc i32 %add to i8
> 16: ret i8 %conv1
> 17: }
>
> Unfortunately, the 'and' on line 8 prevents Scalar Evolution from
> being able to create an expression for '%add' that it knows how to
> evaluate.
>
> The patch detects this pattern in createNodeForPHI and creates an
> equivalent expression that can be evaluated.
>
> Note that SCEV translates the 'and' into
> ZeroExtend(Truncate(%result.03, i8), i32)
>
> So in terms of SCEV expressions, we essentially have
> %add[n] = Add(ZeroExtend(Truncate(%add[n-1], i8), i32), 3)
>
> (BTW, I'm no scholar here, just a layman, so my terminology is
> probably all wrong).
>
> The patch basically moves the ZeroExtend and Truncate outside of the
> recurrence, though it must take into account that for iteration n, the
> ZeroExtend and Truncate apply to the value at iteration n-1.
>
> For a constant step this is accomplished by subtracting one step from
> the recurrence, performing the Truncate and ZeroExtend, and then
> adding the step to the result. In other words:
>
> %add[n] = Add(
> ZeroExtend(
> Truncate(
> Minus(AddRec(Start=0,Step=3)[n], 3),
> i8),
> i32),
> 3)
>
> It's a little more complicated when the Step is another recurrence,
> but essentially the same.
>
> Thoughts?
>
> Matthew C.
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121217/9e9f6799/attachment.html>
More information about the llvm-dev
mailing list