Skip to content

Commit 886781f

Browse files
Handle volatile box types
1 parent b1f87d0 commit 886781f

File tree

3 files changed

+13
-11
lines changed

3 files changed

+13
-11
lines changed

flang/include/flang/Optimizer/Dialect/FIRTypes.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def fir_BoxType : FIR_Type<"Box", "box", [], "BaseBoxType"> {
9090

9191
let extraClassDeclaration = [{
9292
mlir::Type getElementType() const { return getEleTy(); }
93-
bool isVolatile() const { return (bool)getIsVolatile(); }
93+
bool isVolatile() const { return getIsVolatile(); }
9494
}];
9595

9696
let genVerifyDecl = 1;

flang/lib/Optimizer/Dialect/FIROps.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1840,10 +1840,10 @@ llvm::LogicalResult fir::EmboxOp::verify() {
18401840
return emitOpError("slice must not be provided for a scalar");
18411841
if (getSourceBox() && !mlir::isa<fir::ClassType>(getResult().getType()))
18421842
return emitOpError("source_box must be used with fir.class result type");
1843-
// if (fir::isa_volatile_type(getMemref().getType()) !=
1844-
// fir::isa_volatile_type(getResult().getType()))
1845-
// return emitOpError("input and output types must have the same
1846-
// volatility");
1843+
if (fir::isa_volatile_type(getMemref().getType()) !=
1844+
fir::isa_volatile_type(getResult().getType()))
1845+
return emitOpError("cannot convert between volatile and non-volatile "
1846+
"types, use fir.volatile_cast instead");
18471847
return mlir::success();
18481848
}
18491849

flang/lib/Optimizer/Dialect/FIRType.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -681,8 +681,9 @@ mlir::Type changeElementType(mlir::Type type, mlir::Type newElementType,
681681
mlir::Type newInnerType =
682682
changeElementType(t.getEleTy(), newElementType, false);
683683
if (turnBoxIntoClass)
684-
return fir::ClassType::get(newInnerType);
685-
return fir::BoxType::get(newInnerType);
684+
return fir::ClassType::get(
685+
newInnerType); // TODO: volatility on class types
686+
return fir::BoxType::get(newInnerType, t.isVolatile());
686687
})
687688
.Default([&](mlir::Type t) -> mlir::Type {
688689
assert((fir::isa_trivial(t) || llvm::isa<fir::RecordType>(t) ||
@@ -1381,11 +1382,12 @@ changeTypeShape(mlir::Type type,
13811382
return fir::SequenceType::get(*newShape, seqTy.getEleTy());
13821383
return seqTy.getEleTy();
13831384
})
1384-
.Case<fir::ReferenceType>([&](fir::ReferenceType rt) -> mlir::Type {
1385-
return fir::ReferenceType::get(changeTypeShape(rt.getEleTy(), newShape),
1386-
rt.isVolatile());
1385+
.Case<fir::ReferenceType, fir::BoxType>([&](auto t) -> mlir::Type {
1386+
using FIRT = decltype(t);
1387+
return FIRT::get(changeTypeShape(t.getEleTy(), newShape),
1388+
t.isVolatile());
13871389
})
1388-
.Case<fir::PointerType, fir::HeapType, fir::BoxType, fir::ClassType>(
1390+
.Case<fir::PointerType, fir::HeapType, fir::ClassType>(
13891391
[&](auto t) -> mlir::Type {
13901392
using FIRT = decltype(t);
13911393
return FIRT::get(changeTypeShape(t.getEleTy(), newShape));

0 commit comments

Comments
 (0)