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(wrapper);
|
||||||
attemptToFoldIntoPredecessor(target);
|
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);
|
assert(loop.before().getBlocks().size() == 1);
|
||||||
runOnRegion(domInfo, loop.after());
|
runOnRegion(domInfo, loop.after());
|
||||||
assert(loop.after().getBlocks().size() == 1);
|
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) {
|
ValueCategory MLIRScanner::VisitConstantExpr(clang::ConstantExpr *expr) {
|
||||||
auto sv = Visit(expr->getSubExpr());
|
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);
|
assert(sv.val);
|
||||||
return sv;
|
return sv;
|
||||||
}
|
}
|
||||||
|
@ -3597,20 +3605,25 @@ ValueCategory MLIRScanner::VisitBinaryOperator(clang::BinaryOperator *BO) {
|
||||||
}
|
}
|
||||||
case clang::BinaryOperator::Opcode::BO_Sub: {
|
case clang::BinaryOperator::Opcode::BO_Sub: {
|
||||||
auto lhs_v = lhs.getValue(builder);
|
auto lhs_v = lhs.getValue(builder);
|
||||||
|
auto rhs_v = rhs.getValue(builder);
|
||||||
if (lhs_v.getType().isa<mlir::FloatType>()) {
|
if (lhs_v.getType().isa<mlir::FloatType>()) {
|
||||||
auto right = rhs.getValue(builder);
|
assert(rhs_v.getType() == lhs_v.getType());
|
||||||
assert(right.getType() == lhs_v.getType());
|
return ValueCategory(builder.create<SubFOp>(loc, lhs_v, rhs_v),
|
||||||
return ValueCategory(builder.create<SubFOp>(loc, lhs_v, right),
|
|
||||||
/*isReference*/ false);
|
/*isReference*/ false);
|
||||||
} else if (auto pt =
|
} else if (auto pt =
|
||||||
lhs_v.getType().dyn_cast<mlir::LLVM::LLVMPointerType>()) {
|
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(
|
return ValueCategory(
|
||||||
builder.create<SubIOp>(
|
builder.create<SubIOp>(
|
||||||
loc,
|
loc,
|
||||||
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
||||||
lhs_v),
|
lhs_v),
|
||||||
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
||||||
rhs.getValue(builder))),
|
rhs_v)),
|
||||||
/*isReference*/ false);
|
/*isReference*/ false);
|
||||||
} else if (auto mt = lhs_v.getType().dyn_cast<mlir::MemRefType>()) {
|
} else if (auto mt = lhs_v.getType().dyn_cast<mlir::MemRefType>()) {
|
||||||
llvm::errs() << " memref ptrtoint: " << mt << "\n";
|
llvm::errs() << " memref ptrtoint: " << mt << "\n";
|
||||||
|
@ -3620,11 +3633,11 @@ ValueCategory MLIRScanner::VisitBinaryOperator(clang::BinaryOperator *BO) {
|
||||||
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
||||||
lhs_v),
|
lhs_v),
|
||||||
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
builder.create<LLVM::PtrToIntOp>(loc, getMLIRType(BO->getType()),
|
||||||
rhs.getValue(builder))),
|
rhs_v)),
|
||||||
/*isReference*/ false);
|
/*isReference*/ false);
|
||||||
} else {
|
} else {
|
||||||
return ValueCategory(
|
return ValueCategory(
|
||||||
builder.create<SubIOp>(loc, lhs_v, rhs.getValue(builder)),
|
builder.create<SubIOp>(loc, lhs_v, rhs_v),
|
||||||
/*isReference*/ false);
|
/*isReference*/ false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue