[polly] r271898 - Refactor division generation code
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 11 13:28:46 PDT 2016
On 06/07/2016 07:07 PM, Tobias Grosser wrote:
> On 06/06/2016 04:56 PM, Johannes Doerfert via llvm-commits wrote:
>> Author: jdoerfert
>> Date: Mon Jun 6 09:56:17 2016
>> New Revision: 271898
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=271898&view=rev
>> Log:
>> Refactor division generation code
>>
>> This patch refactors the code generation for divisions. This allows to
>> always generate a shift for a power-of-two division and to utilize
>> information about constant divisors in order to truncate the result
>> type.
Hi Johannes,
I unfortunately had to revert this commit as part of the revert in
272483, as I had some conflicts. As this change is mostly unrelated I
would like to recommit it as soon as possible to make sure it is not
outdated.
As I also had some comments on this patch, it would probably be best to
address them before we recommit this patch.
>> Modified:
>> polly/trunk/include/polly/CodeGen/IslExprBuilder.h
>> polly/trunk/lib/CodeGen/IslExprBuilder.cpp
>> polly/trunk/test/Isl/CodeGen/exprModDiv.ll
>> polly/trunk/test/Isl/CodeGen/invariant_load_escaping_second_scop.ll
>>
>> Modified: polly/trunk/include/polly/CodeGen/IslExprBuilder.h
>> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/CodeGen/IslExprBuilder.h?rev=271898&r1=271897&r2=271898&view=diff
>> ==============================================================================
>> --- polly/trunk/include/polly/CodeGen/IslExprBuilder.h (original)
>> +++ polly/trunk/include/polly/CodeGen/IslExprBuilder.h Mon Jun 6 09:56:17 2016
>> @@ -204,6 +204,9 @@ private:
>> llvm::Value *createOpAddressOf(__isl_take isl_ast_expr *Expr);
>> llvm::Value *createAccessAddress(__isl_take isl_ast_expr *Expr);
>>
>> + /// @brief Supported kinds of division.
>> + enum DivisionMode { DM_SIGNED, DM_UNSIGNED, DM_FLOORED };
>
> DM_FLOORD?
>
> Why do you introduce a new enum here? Does isl_ast_expr_type not work? I
> personally believe this new enum adds confusion by adding an additional
> indirection.
>
>> +Value *IslExprBuilder::createDiv(Value *LHS, Value *RHS, DivisionMode DM) {
>> + auto *ConstRHS = dyn_cast<ConstantInt>(RHS);
>> + unsigned UnusedBits = 0;
>> + Value *Res = nullptr;
>> +
>> + if (ConstRHS)
>> + UnusedBits = ConstRHS->getValue().logBase2();
>> +
>> + if (ConstRHS && ConstRHS->getValue().isPowerOf2() &&
>> + ConstRHS->getValue().isNonNegative())
>> + Res = Builder.CreateAShr(LHS, UnusedBits, "polly.div.shr");
>
> As the old code could easily have lowered isl_ast_op_div to ASHR before,
> it would be good to explain in the commit message why using ASHR for
> isl_ast_op_div is correct and why the old code probably just missed this
> opportunity. The current commit message does not make clear why you
> believe this transformation is correct, hence this could just
> be an accidental change. As a result, a post-commit reviewer has to dig
> into this issue himself, which makes post-commit reviews more
> time-consuming.
Could you give a brief explanation why this change is correct, such that
this can be added to the commit message?
>> + else if (DM == DM_SIGNED)
>> + Res = Builder.CreateSDiv(LHS, RHS, "pexp.div", true);
>> + else if (DM == DM_UNSIGNED)
>> + Res = Builder.CreateUDiv(LHS, RHS, "pexp.p_div_q");
>> + else {
>> + assert(DM == DM_FLOORED);
>> + // TODO: Review code and check that this calculation does not yield
>> + // incorrect overflow in some bordercases.
>> + //
>> + // floord(n,d) ((n < 0) ? (n - d + 1) : n) / d
>> + Value *Sum1 = createSub(LHS, RHS, "pexp.fdiv_q.0");
>> + Value *One = ConstantInt::get(Sum1->getType(), 1);
>> + Value *Sum2 = createAdd(Sum1, One, "pexp.fdiv_q.1");
>> + Value *Zero = ConstantInt::get(LHS->getType(), 0);
>> + Value *isNegative = Builder.CreateICmpSLT(LHS, Zero, "pexp.fdiv_q.2");
>> + unifyTypes(LHS, Sum2);
>> + Value *Dividend =
>> + Builder.CreateSelect(isNegative, Sum2, LHS, "pexp.fdiv_q.3");
>> + unifyTypes(Dividend, RHS);
>> + Res = Builder.CreateSDiv(Dividend, RHS, "pexp.fdiv_q.4");
>> + }
>> +
>> + if (UnusedBits) {
>> + auto RequiredBits = Res->getType()->getPrimitiveSizeInBits() - UnusedBits;
>> + Res = Builder.CreateTrunc(Res, Builder.getIntNTy(RequiredBits),
>> + "polly.div.trunc");
>> + }
>
> The last change seems unrelated and should be part of a separate commit.
> I also do not understand the motivation of why we would want to use less
> bits here? Truncating to a non-native type and expanding later will
> introduce additional complexity when lowering to native code. Could you
> explain your reasoning?
I would suggest to drop this for now to make this patch independent of
the type-size changes.
Best,
Tobias
More information about the llvm-commits
mailing list