[PATCH] Fix loop rerolling pass failure with non-consant loop lower
Hal Finkel
hfinkel at anl.gov
Wed Jan 1 16:39:08 PST 2014
David,
Thanks for working on this! This looks good; a few minor comments:
+ // Iteration count scev minus 1
Please capitalize SCEV.
+ const SCEV *ICSCEVm1 = SE->getMinusSCEV(ICSCEV, SE->getConstant(ICSCEV->getType(), 1));
This line is too long. Also, please name this variable ICMinus1SCEV for consistency with the other variables.
+ Value *ICm1; // Iteration count minus 1
Please name this ICMinus1.
+
+
+attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="true" }
+
+!llvm.ident = !{!0}
+
+!0 = metadata !{metadata !"Clang 3.1"}
+!1 = metadata !{metadata !2, metadata !2, i64 0}
+!2 = metadata !{metadata !"int", metadata !3, i64 0}
+!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}
+!4 = metadata !{metadata !"Simple C/C++ TBAA"}
+!5 = metadata !{metadata !6, metadata !6, i64 0}
+!6 = metadata !{metadata !"float", metadata !3, i64 0}
Please remove any unnecessary attributes and metadata.
With these changes, LGTM.
-Hal
----- Original Message -----
> From: "David Peixotto" <dpeixott at codeaurora.org>
> To: llvm-commits at cs.uiuc.edu
> Cc: "Hal Finkel" <hfinkel at anl.gov>
> Sent: Friday, December 20, 2013 7:09:41 PM
> Subject: [PATCH] Fix loop rerolling pass failure with non-consant loop lower
>
> Proposed fix for PR18290: http://llvm.org/bugs/show_bug.cgi?id=18290
>
> The loop rerolling pass was failing with an assertion failure from a
> failed cast on loops like this:
>
> void foo(int *A, int *B, int m, int n) {
> for (int i = m; i < n; i+=4) {
> A[i+0] = B[i+0] * 4;
> A[i+1] = B[i+1] * 4;
> A[i+2] = B[i+2] * 4;
> A[i+3] = B[i+3] * 4;
> }
> }
>
> The code was casting the SCEV-expanded code for the new
> induction variable to a phi-node. When the loop had a non-constant
> lower bound, the SCEV expander would end the code expansion with an
> add insted of a phi node and the cast would fail.
>
> It looks like the cast to a phi node was only needed to get the
> induction variable value coming from the backedge to compute the end
> of loop condition. This patch changes the loop reroller to compare
> the induction variable to the number of times the backedge is taken
> instead of the iteration count of the loop. In other words, we stop
> the loop when the current value of the induction variable ==
> IterationCount-1. Previously, the comparison was comparing the
> induction variable value from the next iteration == IterationCount.
>
> This problem only seems to occur on 32-bit targets. For some reason,
> the loop is not rerolled on 64-bit targets.
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list