Additional fixes
This commit is contained in:
parent
c516d02208
commit
659fc91698
|
@ -644,6 +644,27 @@ void LoopRestructure::runOnRegion(DominanceInfo &domInfo, Region ®ion) {
|
|||
|
||||
attemptToFoldIntoPredecessor(wrapper);
|
||||
attemptToFoldIntoPredecessor(target);
|
||||
if (loop.before().getBlocks().size() != 1) {
|
||||
Block* blk = new Block();
|
||||
OpBuilder B(loop.getContext());
|
||||
B.setInsertionPointToEnd(blk);
|
||||
auto cop = cast<scf::ConditionOp>(loop.before().getBlocks().back().back());
|
||||
auto er = B.create<scf::ExecuteRegionOp>(loop.getLoc(), cop.getOperandTypes());
|
||||
er.region().getBlocks().splice(er.region().getBlocks().begin(), loop.before().getBlocks());
|
||||
loop.before().push_back(blk);
|
||||
SmallVector<Value> yields;
|
||||
for(auto a : er.getResults()) yields.push_back(a);
|
||||
yields.erase(yields.begin());
|
||||
B.create<scf::ConditionOp>(cop.getLoc(), er.getResult(0), yields);
|
||||
B.setInsertionPoint(&*cop);
|
||||
for(auto arg : er.region().front().getArguments()) {
|
||||
auto na = blk->addArgument(arg.getType());
|
||||
arg.replaceAllUsesWith(na);
|
||||
}
|
||||
er.region().front().eraseArguments([](BlockArgument){ return true; });
|
||||
B.create<scf::YieldOp>(cop.getLoc(), cop.getOperands());
|
||||
cop.erase();
|
||||
}
|
||||
assert(loop.before().getBlocks().size() == 1);
|
||||
runOnRegion(domInfo, loop.after());
|
||||
assert(loop.after().getBlocks().size() == 1);
|
||||
|
|
|
@ -408,6 +408,14 @@ mlir::Value MLIRScanner::createAllocOp(mlir::Type t, VarDecl *name,
|
|||
|
||||
ValueCategory MLIRScanner::VisitConstantExpr(clang::ConstantExpr *expr) {
|
||||
auto sv = Visit(expr->getSubExpr());
|
||||
if (auto ty = getMLIRType(expr->getType()).dyn_cast<mlir::IntegerType>()) {
|
||||
if (expr->hasAPValueResult()) {
|
||||
return ValueCategory(
|
||||
builder.create<ConstantIntOp>(getMLIRLocation(expr->getExprLoc()),
|
||||
expr->getResultAsAPSInt().getExtValue(), ty),
|
||||
/*isReference*/ false);
|
||||
}
|
||||
}
|
||||
assert(sv.val);
|
||||
return sv;
|
||||
}
|
||||
|
@ -3597,20 +3605,25 @@ ValueCategory MLIRScanner::VisitBinaryOperator(clang::BinaryOperator *BO) {
|
|||
}
|
||||
case clang::BinaryOperator::Opcode::BO_Sub: {
|
||||
auto lhs_v = lhs.getValue(builder);
|
||||
auto rhs_v = rhs.getValue(builder);
|
||||
if (lhs_v.getType().isa<mlir::FloatType>()) {
|
||||
auto right = rhs.getValue(builder);
|
||||
assert(right.getType() == lhs_v.getType());
|
||||
return ValueCategory(builder.create<SubFOp>(loc, lhs_v, right),
|
||||
assert(rhs_v.getType() == lhs_v.getType());
|
||||
return ValueCategory(builder.create<SubFOp>(loc, lhs_v, rhs_v),
|
||||
/*isReference*/ false);
|
||||
} else if (auto pt =
|
||||
lhs_v.getType().dyn_cast<mlir::LLVM::LLVMPointerType>()) {
|
||||
if (auto IT = rhs_v.getType().dyn_cast<mlir::IntegerType>()) {
|
||||
mlir::Value vals[1] = {builder.create<SubIOp>(loc, builder.create<ConstantIntOp>(loc, 0, IT.getWidth()), rhs_v)};
|
||||
return ValueCategory(builder.create<LLVM::GEPOp>(loc, lhs_v.getType(),
|
||||
lhs_v, ArrayRef<mlir::Value>(vals)), false);
|
||||
}
|
||||
return ValueCategory(
|
||||
builder.create<SubIOp>(
|
||||
loc,
|
||||
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
||||
lhs_v),
|
||||
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
||||
rhs.getValue(builder))),
|
||||
rhs_v)),
|
||||
/*isReference*/ false);
|
||||
} else if (auto mt = lhs_v.getType().dyn_cast<mlir::MemRefType>()) {
|
||||
llvm::errs() << " memref ptrtoint: " << mt << "\n";
|
||||
|
@ -3620,11 +3633,11 @@ ValueCategory MLIRScanner::VisitBinaryOperator(clang::BinaryOperator *BO) {
|
|||
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
||||
lhs_v),
|
||||
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
||||
rhs.getValue(builder))),
|
||||
rhs_v)),
|
||||
/*isReference*/ false);
|
||||
} else {
|
||||
return ValueCategory(
|
||||
builder.create<SubIOp>(loc, lhs_v, rhs.getValue(builder)),
|
||||
builder.create<SubIOp>(loc, lhs_v, rhs_v),
|
||||
/*isReference*/ false);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue