[PATCH] D18202: Enable non-power-of-2 pragma unroll counts
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 16 14:32:01 PDT 2016
sanjoy added a comment.
Minor drive-by comment.
Comment at: lib/Transforms/Utils/LoopUnrollRuntime.cpp:365-367
@@ +364,5 @@
+ // At that point ModValAdd could not overflow as ModValTmp < Count
+ ModVal = B.CreateURem(ModValAdd,
+ ConstantInt::get(BECount->getType(), Count),
+ // And finaly we get correct and overflow safe remainder counter
> mzolotukhin wrote:
> > What is the final expression for `ModVal`? From the code it looks like
> > ```
> > ModVal = ((BECount % Count) + 1) % Count
> > ```
> > Do we really need double urem here? If so, could you please add a comment explaining why we need exactly this?
> Potentially BECount + 1 can unsigned overflow, while (BECount % Count) +1 can not. That is why double URem is used. I can try to simplify this to something like this
> ModVal = ((Count - ModValAdd) >> (ModVal->getSclarType()->getPrimitiveSizeInBits() - 1) & ModValAdd
> ``` or to select here or somewhere in further combiners. However non-power-of-2 is not frequent case as for runtime unrolling it comes only from user specified pragma.
Alternatively, you could have `ModVal` as `BECount == -1 ? <constant expr> : ((BECount +nuw 1) % Count`.
More information about the llvm-commits