[polly] r238929 - Lower signed-divisions without rounding to ashr instructions

Tobias Grosser tobias at grosser.es
Wed Jun 3 08:14:58 PDT 2015


Author: grosser
Date: Wed Jun  3 10:14:58 2015
New Revision: 238929

URL: http://llvm.org/viewvc/llvm-project?rev=238929&view=rev
Log:
Lower signed-divisions without rounding to ashr instructions

Modified:
    polly/trunk/lib/CodeGen/IslExprBuilder.cpp
    polly/trunk/test/Isl/CodeGen/exprModDiv.ll

Modified: polly/trunk/lib/CodeGen/IslExprBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslExprBuilder.cpp?rev=238929&r1=238928&r2=238929&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/IslExprBuilder.cpp (original)
+++ polly/trunk/lib/CodeGen/IslExprBuilder.cpp Wed Jun  3 10:14:58 2015
@@ -295,6 +295,13 @@ Value *IslExprBuilder::createOpBin(__isl
     Res = Builder.CreateNSWMul(LHS, RHS);
     break;
   case isl_ast_op_div:
+    if (auto *Const = dyn_cast<ConstantInt>(RHS)) {
+      auto &Val = Const->getValue();
+      if (Val.isPowerOf2() && Val.isNonNegative()) {
+        Res = Builder.CreateAShr(LHS, Val.ceilLogBase2(), "pexp.div.shr");
+        break;
+      }
+    }
     Res = Builder.CreateSDiv(LHS, RHS, "pexp.div");
     break;
   case isl_ast_op_pdiv_q: // Dividend is non-negative

Modified: polly/trunk/test/Isl/CodeGen/exprModDiv.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/exprModDiv.ll?rev=238929&r1=238928&r2=238929&view=diff
==============================================================================
--- polly/trunk/test/Isl/CodeGen/exprModDiv.ll (original)
+++ polly/trunk/test/Isl/CodeGen/exprModDiv.ll Wed Jun  3 10:14:58 2015
@@ -46,10 +46,8 @@
 ; POW2:  %polly.access.A6 = getelementptr float, float* %A, i64 %pexp.pdiv_r
 
 ; A[i / 128]
-; POW2:  %pexp.div = sdiv i64 %polly.indvar, 128
+; POW2:  %pexp.div.shr = ashr i64 %polly.indvar, 7
 ; POW2:  %polly.access.B8 = getelementptr float, float* %B, i64 %pexp.div
-;
-; FIXME: Make isl mark this as an udiv expression.
 
 ; #define floord(n,d) ((n < 0) ? (n - d + 1) : n) / d
 ; A[p + 128 * floord(-p - 1, 128) + 128]
@@ -62,8 +60,8 @@
 ; POW2:  %polly.access.A10 = getelementptr float, float* %A, i64 %24
 
 ; A[p / 128]
-; POW2:  %pexp.div12 = sdiv i64 %p, 128
-; POW2:  %polly.access.B13 = getelementptr float, float* %B, i64 %pexp.div12
+; POW2:  %pexp.div.shr12 = ashr i64 %p, 7
+; POW2:  %polly.access.B13 = getelementptr float, float* %B, i64 %pexp.div.shr12
 
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 





More information about the llvm-commits mailing list