Correct struct handling of null
This commit is contained in:
parent
f66466c943
commit
c56768fd8f
|
@ -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
|
|
@ -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());
|
||||
|
|
|
@ -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: }
|
Loading…
Reference in New Issue