Correct struct handling of null

This commit is contained in:
William S. Moses 2021-12-28 00:06:28 -05:00 committed by William Moses
parent f66466c943
commit c56768fd8f
4 changed files with 44 additions and 10 deletions

View File

@ -634,7 +634,7 @@ bool Mem2Reg::forwardStoreToLoad(mlir::Value AI, std::vector<ssize_t> idx,
<< AI.getDefiningOp()->getParentOfType<FuncOp>() << "\n";
llvm::errs() << loadOp << " - " << lastVal << "\n";
llvm::errs()
<< loadOp.getType() << " - " << lastVal.getType() << "\n";
<< loadOp.getType() << " - " << lastVal.getType() << " :: " << loadOp.getLoc() << " - " << lastVal.getLoc() << "\n";
}
assert(loadOp.getType() == lastVal.getType() &&
"mismatched load type");

@ -1 +1 @@
Subproject commit 3da08fdc798b04c4865f3cf8813113a1ef1fe903
Subproject commit 5da2a48cde5c48e47caa28b734cd758a514094f2

View File

@ -3501,17 +3501,25 @@ ValueCategory MLIRScanner::VisitBinaryOperator(clang::BinaryOperator *BO) {
}
case clang::BinaryOperator::Opcode::BO_EQ: {
auto lhs_v = lhs.getValue(builder);
auto rhs_v = rhs.getValue(builder);
if (auto mt = lhs_v.getType().dyn_cast<mlir::MemRefType>()) {
lhs_v = builder.create<polygeist::Memref2PointerOp>(
loc, LLVM::LLVMPointerType::get(mt.getElementType()), lhs_v);
}
if (auto mt = rhs_v.getType().dyn_cast<mlir::MemRefType>()) {
rhs_v = builder.create<polygeist::Memref2PointerOp>(
loc, LLVM::LLVMPointerType::get(mt.getElementType()), rhs_v);
}
mlir::Value res;
if (lhs_v.getType().isa<mlir::FloatType>()) {
res = builder.create<arith::CmpFOp>(loc, CmpFPredicate::UEQ, lhs_v,
rhs.getValue(builder));
res =
builder.create<arith::CmpFOp>(loc, CmpFPredicate::UEQ, lhs_v, rhs_v);
} else if (auto pt =
lhs_v.getType().dyn_cast<mlir::LLVM::LLVMPointerType>()) {
res = builder.create<LLVM::ICmpOp>(loc, mlir::LLVM::ICmpPredicate::eq,
lhs_v, rhs.getValue(builder));
lhs_v, rhs_v);
} else {
res = builder.create<arith::CmpIOp>(loc, CmpIPredicate::eq, lhs_v,
rhs.getValue(builder));
res = builder.create<arith::CmpIOp>(loc, CmpIPredicate::eq, lhs_v, rhs_v);
}
return fixInteger(res);
}
@ -4146,10 +4154,12 @@ ValueCategory MLIRScanner::VisitCastExpr(CastExpr *E) {
switch (E->getCastKind()) {
case clang::CastKind::CK_NullToPointer: {
auto llvmType =
Glob.typeTranslator.translateType(anonymize(getLLVMType(E->getType())));
return ValueCategory(builder.create<mlir::LLVM::NullOp>(loc, llvmType),
auto llvmType = getMLIRType(E->getType());
if (llvmType.isa<LLVM::LLVMPointerType>())
return ValueCategory(builder.create<mlir::LLVM::NullOp>(loc, llvmType),
/*isReference*/ false);
else
return ValueCategory(builder.create<polygeist::Pointer2MemrefOp>(loc, llvmType, builder.create<mlir::LLVM::NullOp>(loc, LLVM::LLVMPointerType::get(builder.getI8Type()))), false);
}
case clang::CastKind::CK_UserDefinedConversion: {
return Visit(E->getSubExpr());

View File

@ -0,0 +1,24 @@
// RUN: mlir-clang -S --function=* %s | FileCheck %s
struct C {
int a;
double* b;
};
struct C* make() {
return (struct C*)0;
}
float* makeF() {
return (float*)0;
}
// CHECK: func @make() -> !llvm.ptr<!llvm.struct<(i32, memref<?xf64>)>> attributes {llvm.linkage = #llvm.linkage<external>} {
// CHECK-NEXT: %0 = llvm.mlir.null : !llvm.ptr<!llvm.struct<(i32, memref<?xf64>)>>
// CHECK-NEXT: return %0 : !llvm.ptr<!llvm.struct<(i32, memref<?xf64>)>>
// CHECK-NEXT: }
// CHECK: func @makeF() -> memref<?xf32> attributes {llvm.linkage = #llvm.linkage<external>} {
// CHECK-NEXT: %0 = llvm.mlir.null : !llvm.ptr<i8>
// CHECK-NEXT: %1 = "polygeist.pointer2memref"(%0) : (!llvm.ptr<i8>) -> memref<?xf32>
// CHECK-NEXT: return %1 : memref<?xf32>
// CHECK-NEXT: }