CodeGen: Separate declaration and definition of ClastExpCodeGen
llvm-svn: 148813
diff --git a/polly/lib/CodeGeneration.cpp b/polly/lib/CodeGeneration.cpp
index 80bde83..0ef0f89 100644
--- a/polly/lib/CodeGeneration.cpp
+++ b/polly/lib/CodeGeneration.cpp
@@ -739,107 +739,10 @@
IRBuilder<> &Builder;
const CharMapT *IVS;
- Value *codegen(const clast_name *e, Type *Ty) {
- CharMapT::const_iterator I = IVS->find(e->name);
-
- if (I != IVS->end())
- return Builder.CreateSExtOrBitCast(I->second, Ty);
- else
- llvm_unreachable("Clast name not found");
- }
-
- Value *codegen(const clast_term *e, Type *Ty) {
- APInt a = APInt_from_MPZ(e->val);
-
- Value *ConstOne = ConstantInt::get(Builder.getContext(), a);
- ConstOne = Builder.CreateSExtOrBitCast(ConstOne, Ty);
-
- if (e->var) {
- Value *var = codegen(e->var, Ty);
- return Builder.CreateMul(ConstOne, var);
- }
-
- return ConstOne;
- }
-
- Value *codegen(const clast_binary *e, Type *Ty) {
- Value *LHS = codegen(e->LHS, Ty);
-
- APInt RHS_AP = APInt_from_MPZ(e->RHS);
-
- Value *RHS = ConstantInt::get(Builder.getContext(), RHS_AP);
- RHS = Builder.CreateSExtOrBitCast(RHS, Ty);
-
- switch (e->type) {
- case clast_bin_mod:
- return Builder.CreateSRem(LHS, RHS);
- case clast_bin_fdiv:
- {
- // floord(n,d) ((n < 0) ? (n - d + 1) : n) / d
- Value *One = ConstantInt::get(Builder.getInt1Ty(), 1);
- Value *Zero = ConstantInt::get(Builder.getInt1Ty(), 0);
- One = Builder.CreateZExtOrBitCast(One, Ty);
- Zero = Builder.CreateZExtOrBitCast(Zero, Ty);
- Value *Sum1 = Builder.CreateSub(LHS, RHS);
- Value *Sum2 = Builder.CreateAdd(Sum1, One);
- Value *isNegative = Builder.CreateICmpSLT(LHS, Zero);
- Value *Dividend = Builder.CreateSelect(isNegative, Sum2, LHS);
- return Builder.CreateSDiv(Dividend, RHS);
- }
- case clast_bin_cdiv:
- {
- // ceild(n,d) ((n < 0) ? n : (n + d - 1)) / d
- Value *One = ConstantInt::get(Builder.getInt1Ty(), 1);
- Value *Zero = ConstantInt::get(Builder.getInt1Ty(), 0);
- One = Builder.CreateZExtOrBitCast(One, Ty);
- Zero = Builder.CreateZExtOrBitCast(Zero, Ty);
- Value *Sum1 = Builder.CreateAdd(LHS, RHS);
- Value *Sum2 = Builder.CreateSub(Sum1, One);
- Value *isNegative = Builder.CreateICmpSLT(LHS, Zero);
- Value *Dividend = Builder.CreateSelect(isNegative, LHS, Sum2);
- return Builder.CreateSDiv(Dividend, RHS);
- }
- case clast_bin_div:
- return Builder.CreateSDiv(LHS, RHS);
- default:
- llvm_unreachable("Unknown clast binary expression type");
- };
- }
-
- Value *codegen(const clast_reduction *r, Type *Ty) {
- assert(( r->type == clast_red_min
- || r->type == clast_red_max
- || r->type == clast_red_sum)
- && "Clast reduction type not supported");
- Value *old = codegen(r->elts[0], Ty);
-
- for (int i=1; i < r->n; ++i) {
- Value *exprValue = codegen(r->elts[i], Ty);
-
- switch (r->type) {
- case clast_red_min:
- {
- Value *cmp = Builder.CreateICmpSLT(old, exprValue);
- old = Builder.CreateSelect(cmp, old, exprValue);
- break;
- }
- case clast_red_max:
- {
- Value *cmp = Builder.CreateICmpSGT(old, exprValue);
- old = Builder.CreateSelect(cmp, old, exprValue);
- break;
- }
- case clast_red_sum:
- old = Builder.CreateAdd(old, exprValue);
- break;
- default:
- llvm_unreachable("Clast unknown reduction type");
- }
- }
-
- return old;
- }
-
+ Value *codegen(const clast_name *e, Type *Ty);
+ Value *codegen(const clast_term *e, Type *Ty);
+ Value *codegen(const clast_binary *e, Type *Ty);
+ Value *codegen(const clast_reduction *r, Type *Ty);
public:
// A generator for clast expressions.
@@ -849,36 +752,141 @@
// @param IVMAP A Map that translates strings describing the induction
// variables to the Values* that represent these variables
// on the LLVM side.
- ClastExpCodeGen(IRBuilder<> &B, CharMapT *IVMap) : Builder(B), IVS(IVMap) {}
+ ClastExpCodeGen(IRBuilder<> &B, CharMapT *IVMap);
// Generates code to calculate a given clast expression.
//
// @param e The expression to calculate.
// @return The Value that holds the result.
- Value *codegen(const clast_expr *e, Type *Ty) {
- switch(e->type) {
- case clast_expr_name:
- return codegen((const clast_name *)e, Ty);
- case clast_expr_term:
- return codegen((const clast_term *)e, Ty);
- case clast_expr_bin:
- return codegen((const clast_binary *)e, Ty);
- case clast_expr_red:
- return codegen((const clast_reduction *)e, Ty);
- default:
- llvm_unreachable("Unknown clast expression!");
- }
- }
+ Value *codegen(const clast_expr *e, Type *Ty);
// @brief Reset the CharMap.
//
// This function is called to reset the CharMap to new one, while generating
// OpenMP code.
- void setIVS(CharMapT *IVSNew) {
- IVS = IVSNew;
+ void setIVS(CharMapT *IVSNew);
+};
+
+Value *ClastExpCodeGen::codegen(const clast_name *e, Type *Ty) {
+ CharMapT::const_iterator I = IVS->find(e->name);
+
+ assert(I != IVS->end() && "Clast name not found");
+
+ return Builder.CreateSExtOrBitCast(I->second, Ty);
+}
+
+Value *ClastExpCodeGen::codegen(const clast_term *e, Type *Ty) {
+ APInt a = APInt_from_MPZ(e->val);
+
+ Value *ConstOne = ConstantInt::get(Builder.getContext(), a);
+ ConstOne = Builder.CreateSExtOrBitCast(ConstOne, Ty);
+
+ if (!e->var)
+ return ConstOne;
+
+ Value *var = codegen(e->var, Ty);
+ return Builder.CreateMul(ConstOne, var);
+}
+
+Value *ClastExpCodeGen::codegen(const clast_binary *e, Type *Ty) {
+ Value *LHS = codegen(e->LHS, Ty);
+
+ APInt RHS_AP = APInt_from_MPZ(e->RHS);
+
+ Value *RHS = ConstantInt::get(Builder.getContext(), RHS_AP);
+ RHS = Builder.CreateSExtOrBitCast(RHS, Ty);
+
+ switch (e->type) {
+ case clast_bin_mod:
+ return Builder.CreateSRem(LHS, RHS);
+ case clast_bin_fdiv:
+ {
+ // floord(n,d) ((n < 0) ? (n - d + 1) : n) / d
+ Value *One = ConstantInt::get(Builder.getInt1Ty(), 1);
+ Value *Zero = ConstantInt::get(Builder.getInt1Ty(), 0);
+ One = Builder.CreateZExtOrBitCast(One, Ty);
+ Zero = Builder.CreateZExtOrBitCast(Zero, Ty);
+ Value *Sum1 = Builder.CreateSub(LHS, RHS);
+ Value *Sum2 = Builder.CreateAdd(Sum1, One);
+ Value *isNegative = Builder.CreateICmpSLT(LHS, Zero);
+ Value *Dividend = Builder.CreateSelect(isNegative, Sum2, LHS);
+ return Builder.CreateSDiv(Dividend, RHS);
+ }
+ case clast_bin_cdiv:
+ {
+ // ceild(n,d) ((n < 0) ? n : (n + d - 1)) / d
+ Value *One = ConstantInt::get(Builder.getInt1Ty(), 1);
+ Value *Zero = ConstantInt::get(Builder.getInt1Ty(), 0);
+ One = Builder.CreateZExtOrBitCast(One, Ty);
+ Zero = Builder.CreateZExtOrBitCast(Zero, Ty);
+ Value *Sum1 = Builder.CreateAdd(LHS, RHS);
+ Value *Sum2 = Builder.CreateSub(Sum1, One);
+ Value *isNegative = Builder.CreateICmpSLT(LHS, Zero);
+ Value *Dividend = Builder.CreateSelect(isNegative, LHS, Sum2);
+ return Builder.CreateSDiv(Dividend, RHS);
+ }
+ case clast_bin_div:
+ return Builder.CreateSDiv(LHS, RHS);
+ };
+
+ llvm_unreachable("Unknown clast binary expression type");
+}
+
+Value *ClastExpCodeGen::codegen(const clast_reduction *r, Type *Ty) {
+ assert(( r->type == clast_red_min
+ || r->type == clast_red_max
+ || r->type == clast_red_sum)
+ && "Clast reduction type not supported");
+ Value *old = codegen(r->elts[0], Ty);
+
+ for (int i=1; i < r->n; ++i) {
+ Value *exprValue = codegen(r->elts[i], Ty);
+
+ switch (r->type) {
+ case clast_red_min:
+ {
+ Value *cmp = Builder.CreateICmpSLT(old, exprValue);
+ old = Builder.CreateSelect(cmp, old, exprValue);
+ break;
+ }
+ case clast_red_max:
+ {
+ Value *cmp = Builder.CreateICmpSGT(old, exprValue);
+ old = Builder.CreateSelect(cmp, old, exprValue);
+ break;
+ }
+ case clast_red_sum:
+ old = Builder.CreateAdd(old, exprValue);
+ break;
+ default:
+ llvm_unreachable("Clast unknown reduction type");
+ }
}
-};
+ return old;
+}
+
+ClastExpCodeGen::ClastExpCodeGen(IRBuilder<> &B, CharMapT *IVMap)
+ : Builder(B), IVS(IVMap) {}
+
+Value *ClastExpCodeGen::codegen(const clast_expr *e, Type *Ty) {
+ switch(e->type) {
+ case clast_expr_name:
+ return codegen((const clast_name *)e, Ty);
+ case clast_expr_term:
+ return codegen((const clast_term *)e, Ty);
+ case clast_expr_bin:
+ return codegen((const clast_binary *)e, Ty);
+ case clast_expr_red:
+ return codegen((const clast_reduction *)e, Ty);
+ }
+
+ llvm_unreachable("Unknown clast expression!");
+}
+
+void ClastExpCodeGen::setIVS(CharMapT *IVSNew) {
+ IVS = IVSNew;
+}
class ClastStmtCodeGen {
// The Scop we code generate.