Commit 843c7e157dd90f27bd530638b2e31162ee693be6
1 parent
5c84b9d1
llvm abstraction fix, bug remains
Showing
1 changed file
with
58 additions
and
36 deletions
sdk/plugins/llvm.cpp
| ... | ... | @@ -105,26 +105,41 @@ struct MatrixBuilder |
| 105 | 105 | Constant *autoConstant(double value) const { return m->isFloating() ? ((m->bits() == 64) ? constant(value) : constant(float(value))) : constant(int(value), m->bits()); } |
| 106 | 106 | AllocaInst *autoAlloca(double value, const Twine &name = "") const { AllocaInst *alloca = b->CreateAlloca(ty(), 0, name); b->CreateStore(autoConstant(value), alloca); return alloca; } |
| 107 | 107 | |
| 108 | - Value *data(bool cast = true) const { LoadInst *data = b->CreateLoad(b->CreateStructGEP(v, 0), name+"_data"); return cast ? b->CreatePointerCast(data, ptrTy()) : data; } | |
| 109 | - Value *channels() const { return m->singleChannel() ? static_cast<Value*>(one()) : static_cast<Value*>(b->CreateLoad(b->CreateStructGEP(v, 1), name+"_channels")); } | |
| 110 | - Value *columns() const { return m->singleColumn() ? static_cast<Value*>(one()) : static_cast<Value*>(b->CreateLoad(b->CreateStructGEP(v, 2), name+"_columns")); } | |
| 111 | - Value *rows() const { return m->singleRow() ? static_cast<Value*>(one()) : static_cast<Value*>(b->CreateLoad(b->CreateStructGEP(v, 3), name+"_rows")); } | |
| 112 | - Value *frames() const { return m->singleFrame() ? static_cast<Value*>(one()) : static_cast<Value*>(b->CreateLoad(b->CreateStructGEP(v, 4), name+"_frames")); } | |
| 113 | - Value *hash() const { return b->CreateLoad(b->CreateStructGEP(v, 5), name+"_hash"); } | |
| 114 | - | |
| 115 | - void setData(Value *value) const { b->CreateStore(value, b->CreateStructGEP(v, 0)); } | |
| 116 | - void setChannels(Value *value) const { b->CreateStore(value, b->CreateStructGEP(v, 1)); } | |
| 117 | - void setColumns(Value *value) const { b->CreateStore(value, b->CreateStructGEP(v, 2)); } | |
| 118 | - void setRows(Value *value) const { b->CreateStore(value, b->CreateStructGEP(v, 3)); } | |
| 119 | - void setFrames(Value *value) const { b->CreateStore(value, b->CreateStructGEP(v, 4)); } | |
| 120 | - void setHash(Value *value) const { b->CreateStore(value, b->CreateStructGEP(v, 5)); } | |
| 121 | - | |
| 122 | - void copyHeader(const MatrixBuilder &other) const { | |
| 123 | - setChannels(other.channels()); | |
| 124 | - setColumns(other.columns()); | |
| 125 | - setRows(other.rows()); | |
| 126 | - setFrames(other.frames()); | |
| 127 | - setHash(other.hash()); | |
| 108 | + Value *data(Value *matrix, const Twine &name = "") const { return b->CreateLoad(b->CreateStructGEP(matrix, 0), name+"_data"); } | |
| 109 | + Value *data(Value *matrix, Type *type, const Twine &name = "") const { return b->CreatePointerCast(data(matrix, name), type); } | |
| 110 | + Value *channels(Value *matrix, const Twine &name = "") const { return b->CreateLoad(b->CreateStructGEP(matrix, 1), name+"_channels"); } | |
| 111 | + Value *columns(Value *matrix, const Twine &name = "") const { return b->CreateLoad(b->CreateStructGEP(matrix, 2), name+"_columns"); } | |
| 112 | + Value *rows(Value *matrix, const Twine &name = "") const { return b->CreateLoad(b->CreateStructGEP(matrix, 3), name+"_rows"); } | |
| 113 | + Value *frames(Value *matrix, const Twine &name = "") const { return b->CreateLoad(b->CreateStructGEP(matrix, 4), name+"_frames"); } | |
| 114 | + Value *hash(Value *matrix, const Twine &name = "") const { return b->CreateLoad(b->CreateStructGEP(matrix, 5), name+"_hash"); } | |
| 115 | + | |
| 116 | + Value *data(bool cast = true) const { return cast ? data(v, ptrTy(), name) : data(v, name); } | |
| 117 | + Value *channels() const { return m->singleChannel() ? static_cast<Value*>(one()) : channels(v, name); } | |
| 118 | + Value *columns() const { return m->singleColumn() ? static_cast<Value*>(one()) : columns(v, name); } | |
| 119 | + Value *rows() const { return m->singleRow() ? static_cast<Value*>(one()) : rows(v, name); } | |
| 120 | + Value *frames() const { return m->singleFrame() ? static_cast<Value*>(one()) : frames(v, name); } | |
| 121 | + Value *hash() const { return hash(v, name); } | |
| 122 | + | |
| 123 | + void setData(Value *matrix, Value *value) const { b->CreateStore(value, b->CreateStructGEP(matrix, 0)); } | |
| 124 | + void setChannels(Value *matrix, Value *value) const { b->CreateStore(value, b->CreateStructGEP(matrix, 1)); } | |
| 125 | + void setColumns(Value *matrix, Value *value) const { b->CreateStore(value, b->CreateStructGEP(matrix, 2)); } | |
| 126 | + void setRows(Value *matrix, Value *value) const { b->CreateStore(value, b->CreateStructGEP(matrix, 3)); } | |
| 127 | + void setFrames(Value *matrix, Value *value) const { b->CreateStore(value, b->CreateStructGEP(matrix, 4)); } | |
| 128 | + void setHash(Value *matrix, Value *value) const { b->CreateStore(value, b->CreateStructGEP(matrix, 5)); } | |
| 129 | + | |
| 130 | + void setData(Value *value) const { setData(v, value); } | |
| 131 | + void setChannels(Value *value) const { setChannels(v, value); } | |
| 132 | + void setColumns(Value *value) const { setColumns(v, value); } | |
| 133 | + void setRows(Value *value) const { setRows(v, value); } | |
| 134 | + void setFrames(Value *value) const { setFrames(v, value); } | |
| 135 | + void setHash(Value *value) const { setHash(v, value); } | |
| 136 | + | |
| 137 | + void copyHeaderTo(Value *matrix) const { | |
| 138 | + setChannels(matrix, channels()); | |
| 139 | + setColumns(matrix, columns()); | |
| 140 | + setRows(matrix, rows()); | |
| 141 | + setFrames(matrix, frames()); | |
| 142 | + setHash(matrix, hash()); | |
| 128 | 143 | } |
| 129 | 144 | |
| 130 | 145 | void deallocate() const { |
| ... | ... | @@ -222,7 +237,12 @@ struct MatrixBuilder |
| 222 | 237 | deindex(rem, c, x, y); |
| 223 | 238 | } |
| 224 | 239 | |
| 240 | + LoadInst *load(Value *matrix, Type *type, Value *i) const { return b->CreateLoad(b->CreateGEP(data(matrix, type), i)); } | |
| 225 | 241 | LoadInst *load(Value *i) const { return b->CreateLoad(b->CreateGEP(data(), i)); } |
| 242 | + StoreInst *store(Value *matrix, Type *type, Value *i, Value *value) const { Value *d = data(matrix, type); | |
| 243 | + d->dump(); i->dump(); | |
| 244 | + Value *idx = b->CreateGEP(d, i); | |
| 245 | + return b->CreateStore(value, idx); } | |
| 226 | 246 | StoreInst *store(Value *i, Value *value) const { return b->CreateStore(value, b->CreateGEP(data(), i)); } |
| 227 | 247 | |
| 228 | 248 | Value *cast(Value *i, const MatrixBuilder &dst) const { return (m->type() == dst.m->type()) ? i : b->CreateCast(CastInst::getCastOpcode(i, m->isSigned(), dst.ty(), dst.m->isSigned()), i, dst.ty()); } |
| ... | ... | @@ -322,8 +342,8 @@ public: |
| 322 | 342 | fileTable.insert(fileIndex, file); |
| 323 | 343 | } |
| 324 | 344 | |
| 325 | - virtual Value *preallocation(const MatrixBuilder &src, const MatrixBuilder &dst) const = 0; /*!< Allocate the destintation matrix given the source matrix. */ | |
| 326 | - virtual void kernel(const MatrixBuilder &src, const MatrixBuilder &dst, PHINode *i) const = 0; /*!< Run the computation given the source matrix. */ | |
| 345 | + virtual Value *preallocation(const MatrixBuilder &src, Value *dst) const = 0; /*!< Allocate the destintation matrix given the source matrix. */ | |
| 346 | + virtual void kernel(const MatrixBuilder &src, Value *dst, PHINode *i) const = 0; /*!< Run the computation given the source matrix. */ | |
| 327 | 347 | |
| 328 | 348 | void optimize(Function *f) const |
| 329 | 349 | { |
| ... | ... | @@ -460,10 +480,9 @@ public: |
| 460 | 480 | BasicBlock *entry = BasicBlock::Create(getGlobalContext(), "entry", function); |
| 461 | 481 | IRBuilder<> builder(entry); |
| 462 | 482 | MatrixBuilder mb(m, src, &builder, function, "src"); |
| 463 | - MatrixBuilder nb(NULL, dst, &builder, function, "dst"); | |
| 464 | 483 | |
| 465 | - Value *kernelSize = preallocation(mb, nb); | |
| 466 | - nb.setData(builder.CreateCall(malloc, nb.bytes())); | |
| 484 | + Value *kernelSize = preallocation(mb, dst); | |
| 485 | + mb.setData(dst, builder.CreateCall(malloc, kernelSize)); | |
| 467 | 486 | builder.CreateRet(kernelSize); |
| 468 | 487 | |
| 469 | 488 | optimize(function); |
| ... | ... | @@ -500,8 +519,7 @@ public: |
| 500 | 519 | BasicBlock *loop, *exit; |
| 501 | 520 | PHINode *i = MatrixBuilder::beginLoop(builder, function, entry, loop, exit, len, "i"); |
| 502 | 521 | |
| 503 | - Matrix n; | |
| 504 | - kernel(MatrixBuilder(m, src, &builder, function, "src"), MatrixBuilder(&n, dst, &builder, function, "dst"), i); | |
| 522 | + kernel(MatrixBuilder(m, src, &builder, function, "src"), dst, i); | |
| 505 | 523 | |
| 506 | 524 | MatrixBuilder::endLoop(builder, loop, exit); |
| 507 | 525 | builder.CreateRetVoid(); |
| ... | ... | @@ -643,18 +661,18 @@ class StitchableTransform : public UnaryTransform |
| 643 | 661 | Q_OBJECT |
| 644 | 662 | |
| 645 | 663 | public: |
| 646 | - virtual Value *stitch(const MatrixBuilder &src, const MatrixBuilder &dst, Value *val) const = 0; /*!< A simplification of Kernel::build() for stitchable kernels. */ | |
| 664 | + virtual Value *stitch(const MatrixBuilder &src, Value *val) const = 0; /*!< A simplification of Kernel::build() for stitchable kernels. */ | |
| 647 | 665 | |
| 648 | - virtual Value *preallocation(const MatrixBuilder &src, const MatrixBuilder &dst) const | |
| 666 | + virtual Value *preallocation(const MatrixBuilder &src, Value *dst) const | |
| 649 | 667 | { |
| 650 | - dst.copyHeader(src); | |
| 651 | - return dst.elements(); | |
| 668 | + src.copyHeaderTo(dst); | |
| 669 | + return src.elements(); | |
| 652 | 670 | } |
| 653 | 671 | |
| 654 | 672 | private: |
| 655 | - void kernel(const MatrixBuilder &src, const MatrixBuilder &dst, PHINode *i) const | |
| 673 | + void kernel(const MatrixBuilder &src, Value *dst, PHINode *i) const | |
| 656 | 674 | { |
| 657 | - dst.store(i, stitch(src, dst, src.load(i))); | |
| 675 | + src.store(dst, src.ty(), i, stitch(src, src.load(i))); | |
| 658 | 676 | } |
| 659 | 677 | }; |
| 660 | 678 | |
| ... | ... | @@ -949,10 +967,9 @@ class addTransform : public StitchableTransform |
| 949 | 967 | Q_PROPERTY(double b READ get_b WRITE set_b RESET reset_b STORED false) |
| 950 | 968 | BR_PROPERTY(double, b, 0) |
| 951 | 969 | |
| 952 | - Value *stitch(const MatrixBuilder &src, const MatrixBuilder &dst, Value *val) const | |
| 970 | + Value *stitch(const MatrixBuilder &src, Value *val) const | |
| 953 | 971 | { |
| 954 | - (void) src; | |
| 955 | - return dst.add(val, dst.autoConstant(b)); | |
| 972 | + return src.add(val, src.autoConstant(b)); | |
| 956 | 973 | } |
| 957 | 974 | }; |
| 958 | 975 | |
| ... | ... | @@ -1064,6 +1081,11 @@ class LLVMInitializer : public Initializer |
| 1064 | 1081 | Type::getInt16Ty(getGlobalContext()), // hash |
| 1065 | 1082 | NULL); |
| 1066 | 1083 | |
| 1084 | +// Matrix m(1, 2, 3, 4, Matrix::f32); | |
| 1085 | +// UnaryAllocation allocation = makeUnaryAllocation("add(1)", &m); | |
| 1086 | +// Matrix n; | |
| 1087 | +// allocation(&m, &n); | |
| 1088 | +// qDebug() << n.channels << n.rows << n.columns << n.frames << n.hash; | |
| 1067 | 1089 | QSharedPointer<Transform> kernel(Transform::make("add(1)", NULL)); |
| 1068 | 1090 | |
| 1069 | 1091 | Template src, dst; | ... | ... |