Skip to content

Commit d1ad38f

Browse files
ashermancinelliIanWood1
authored andcommitted
[flang] Add lowering of volatile references (llvm#132486)
[RFC on discourse](https://discourse.llvm.org/t/rfc-volatile-representation-in-flang/85404/1) Flang currently lacks support for volatile variables. For some cases, the compiler produces TODO error messages and others are ignored. Some of our tests are like the example from _C.4 Clause 8 notes: The VOLATILE attribute (8.5.20)_ and require volatile variables. Prior commits: ``` c9ec1bc [flang] Handle volatility in lowering and codegen (llvm#135311) e42f860 [flang][nfc] Support volatility in Fir ops (llvm#134858) b2711e1 [flang][nfc] Support volatile on ref, box, and class types (llvm#134386) ```
1 parent ea7633a commit d1ad38f

32 files changed

+1092
-62
lines changed

flang/docs/FortranStandardsSupport.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ All features except those listed in the following table are supported.
104104
|------------------------------------------------------------|--------|---------------------------------------------------------|
105105
| Parameterized Derived Types | P | PDT with length type parameters is not supported. See [Proposal](ParameterizedDerivedTypes.md) |
106106
| Assignment to allocatable | P | Assignment to whole allocatable in FORALL is not implemented |
107-
| The VOLATILE attribute | P | VOLATILE in procedure interfaces is not implemented |
108107
| Asynchronous input/output | P | IO will happen synchronously |
109108
| MIN/MAX extensions for CHARACTER | P | Some variants are not supported |
110109

flang/docs/ReleaseNotes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ page](https://llvm.org/releases/).
2424

2525
## Major New Features
2626

27+
* Initial support for VOLATILE variables and procedure interface arguments has been added.
28+
2729
## Bug Fixes
2830

2931
## Non-comprehensive list of changes in this release

flang/include/flang/Optimizer/Builder/BoxValue.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ class AbstractIrBox : public AbstractBox, public AbstractArrayBox {
236236
auto ty = getBoxTy().getEleTy();
237237
if (fir::isa_ref_type(ty))
238238
return ty;
239-
return fir::ReferenceType::get(ty, fir::isa_volatile_type(ty));
239+
return fir::ReferenceType::get(ty, fir::isa_volatile_type(getBoxTy()));
240240
}
241241

242242
/// Get the scalar type related to the described entity

flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -829,14 +829,16 @@ template <int N, typename A>
829829
void createArguments(llvm::SmallVectorImpl<mlir::Value> &result,
830830
fir::FirOpBuilder &builder, mlir::Location loc,
831831
mlir::FunctionType fTy, A arg) {
832-
result.emplace_back(builder.createConvert(loc, fTy.getInput(N), arg));
832+
result.emplace_back(
833+
builder.createConvertWithVolatileCast(loc, fTy.getInput(N), arg));
833834
}
834835

835836
template <int N, typename A, typename... As>
836837
void createArguments(llvm::SmallVectorImpl<mlir::Value> &result,
837838
fir::FirOpBuilder &builder, mlir::Location loc,
838839
mlir::FunctionType fTy, A arg, As... args) {
839-
result.emplace_back(builder.createConvert(loc, fTy.getInput(N), arg));
840+
result.emplace_back(
841+
builder.createConvertWithVolatileCast(loc, fTy.getInput(N), arg));
840842
createArguments<N + 1>(result, builder, loc, fTy, args...);
841843
}
842844
} // namespace helper

flang/include/flang/Optimizer/Dialect/FIROps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2755,7 +2755,7 @@ def fir_AddrOfOp : fir_OneResultOp<"address_of", [NoMemoryEffect]> {
27552755
let assemblyFormat = "`(` $symbol `)` attr-dict `:` type($resTy)";
27562756
}
27572757

2758-
def fir_VolatileCastOp : fir_SimpleOneResultOp<"volatile_cast", [NoMemoryEffect]> {
2758+
def fir_VolatileCastOp : fir_SimpleOneResultOp<"volatile_cast", [Pure]> {
27592759
let summary = "cast between volatile and non-volatile types";
27602760
let description = [{
27612761
Cast between volatile and non-volatile types. The types must be otherwise

flang/include/flang/Optimizer/Dialect/FIRType.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,10 @@ inline mlir::Type wrapInClassOrBoxType(mlir::Type eleTy,
457457
return fir::BoxType::get(eleTy);
458458
}
459459

460+
/// Re-create the given type with the given volatility, if this is a type
461+
/// that can represent volatility.
462+
mlir::Type updateTypeWithVolatility(mlir::Type type, bool isVolatile);
463+
460464
/// Return the elementType where intrinsic types are replaced with none for
461465
/// unlimited polymorphic entities.
462466
///

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,11 @@ def fir_ReferenceType : FIR_Type<"Reference", "ref"> {
365365

366366
let description = [{
367367
The type of a reference to an entity in memory.
368+
369+
References can be volatile. Any ops taking an operand of a volatile
370+
reference must set their memory effects appropriately. Accesses of
371+
volatile references are currently modeled as read and write effects
372+
to a specific memory resource.
368373
}];
369374

370375
let parameters = (ins "mlir::Type":$eleTy, "bool":$isVolatile);

flang/lib/Lower/Bridge.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,7 +1755,8 @@ class FirConverter : public Fortran::lower::AbstractConverter {
17551755
// tags all result variables with one of the largest types to allow
17561756
// them to share the same storage. Convert this to the actual type.
17571757
if (resultRef.getType() != resultRefType)
1758-
resultRef = builder->createConvert(loc, resultRefType, resultRef);
1758+
resultRef = builder->createConvertWithVolatileCast(
1759+
loc, resultRefType, resultRef);
17591760
return builder->create<fir::LoadOp>(loc, resultRef);
17601761
});
17611762
genExitRoutine(false, resultVal);
@@ -3732,10 +3733,11 @@ class FirConverter : public Fortran::lower::AbstractConverter {
37323733
builder->createMinusOneInteger(loc, builder->getIndexType())};
37333734
mlir::Value baseAddr =
37343735
hlfir::genVariableRawAddress(loc, *builder, selector);
3736+
const bool isVolatile = fir::isa_volatile_type(selector.getType());
37353737
mlir::Type eleType =
37363738
fir::unwrapSequenceType(fir::unwrapRefType(baseAddr.getType()));
3737-
mlir::Type rank1Type =
3738-
fir::ReferenceType::get(builder->getVarLenSeqTy(eleType, 1));
3739+
mlir::Type rank1Type = fir::ReferenceType::get(
3740+
builder->getVarLenSeqTy(eleType, 1), isVolatile);
37393741
baseAddr = builder->createConvert(loc, rank1Type, baseAddr);
37403742
if (selector.isCharacter()) {
37413743
mlir::Value len = hlfir::genCharLength(loc, *builder, selector);
@@ -3755,7 +3757,8 @@ class FirConverter : public Fortran::lower::AbstractConverter {
37553757
mlir::cast<fir::BaseBoxType>(fir::unwrapRefType(selector.getType()));
37563758
mlir::Type newBoxType = boxTy.getBoxTypeWithNewShape(rank);
37573759
if (fir::isa_ref_type(selector.getType()))
3758-
newBoxType = fir::ReferenceType::get(newBoxType);
3760+
newBoxType = fir::ReferenceType::get(
3761+
newBoxType, fir::isa_volatile_type(selector.getType()));
37593762
// Give rank info to value via cast, and get rid of the box if not needed
37603763
// (simple scalars, contiguous arrays... This is done by
37613764
// translateVariableToExtendedValue).
@@ -5491,8 +5494,9 @@ class FirConverter : public Fortran::lower::AbstractConverter {
54915494
// return, PassBy::AddressAndLength should be retired.
54925495
mlir::Location loc = toLocation();
54935496
fir::factory::CharacterExprHelper charHelp{*builder, loc};
5494-
mlir::Value box =
5495-
charHelp.createEmboxChar(arg.firArgument, arg.firLength);
5497+
mlir::Value casted =
5498+
builder->createVolatileCast(loc, false, arg.firArgument);
5499+
mlir::Value box = charHelp.createEmboxChar(casted, arg.firLength);
54965500
mapBlockArgToDummyOrResult(arg.entity->get(), box, isResult);
54975501
} else {
54985502
if (arg.entity.has_value()) {

flang/lib/Lower/CallInterface.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,10 +1111,7 @@ class Fortran::lower::CallInterfaceImpl {
11111111
addMLIRAttr(fir::getContiguousAttrName());
11121112
if (obj.attrs.test(Attrs::Value))
11131113
isValueAttr = true; // TODO: do we want an mlir::Attribute as well?
1114-
if (obj.attrs.test(Attrs::Volatile)) {
1115-
TODO(loc, "VOLATILE in procedure interface");
1116-
addMLIRAttr(fir::getVolatileAttrName());
1117-
}
1114+
11181115
// obj.attrs.test(Attrs::Asynchronous) does not impact the way the argument
11191116
// is passed given flang implement asynch IO synchronously. However, it's
11201117
// added to determine whether the argument is captured.
@@ -1151,7 +1148,8 @@ class Fortran::lower::CallInterfaceImpl {
11511148

11521149
if (obj.attrs.test(Attrs::Allocatable) || obj.attrs.test(Attrs::Pointer)) {
11531150
// Pass as fir.ref<fir.box> or fir.ref<fir.class>
1154-
mlir::Type boxRefType = fir::ReferenceType::get(boxType);
1151+
const bool isVolatile = obj.attrs.test(Attrs::Volatile);
1152+
mlir::Type boxRefType = fir::ReferenceType::get(boxType, isVolatile);
11551153
addFirOperand(boxRefType, nextPassedArgPosition(), Property::MutableBox,
11561154
attrs);
11571155
addPassedArg(PassEntityBy::MutableBox, entity, characteristics);

flang/lib/Lower/ConvertCall.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1369,7 +1369,10 @@ static PreparedDummyArgument preparePresentUserCallActualArgument(
13691369
// it according to the interface.
13701370
mlir::Value addr;
13711371
if (mlir::isa<fir::BoxCharType>(dummyTypeWithActualRank)) {
1372-
addr = hlfir::genVariableBoxChar(loc, builder, entity);
1372+
// Cast the argument to match the volatility of the dummy argument.
1373+
auto nonVolatileEntity = hlfir::Entity{builder.createVolatileCast(
1374+
loc, fir::isa_volatile_type(dummyType), entity)};
1375+
addr = hlfir::genVariableBoxChar(loc, builder, nonVolatileEntity);
13731376
} else if (mlir::isa<fir::BaseBoxType>(dummyTypeWithActualRank)) {
13741377
entity = hlfir::genVariableBox(loc, builder, entity);
13751378
// Ensures the box has the right attributes and that it holds an

flang/lib/Lower/ConvertExpr.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2705,7 +2705,7 @@ class ScalarExprLowering {
27052705
mlir::isa<fir::BoxCharType>(funcTy.getResult(0))) {
27062706
auto boxTy =
27072707
mlir::cast<fir::BoxCharType>(funcTy.getResult(0));
2708-
mlir::Value ref = builder.createConvert(
2708+
mlir::Value ref = builder.createConvertWithVolatileCast(
27092709
loc, builder.getRefType(boxTy.getEleTy()), x.getAddr());
27102710
auto len = builder.create<fir::UndefOp>(
27112711
loc, builder.getCharacterLengthType());
@@ -6306,7 +6306,8 @@ class ArrayExprLowering {
63066306
mlir::Value buffi = computeCoordinate(buff, off);
63076307
llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
63086308
builder, loc, memcpyType(), buffi, v.getAddr(), byteSz);
6309-
createCallMemcpy(args, /*isVolatile=*/false);
6309+
const bool isVolatile = fir::isa_volatile_type(v.getAddr().getType());
6310+
createCallMemcpy(args, isVolatile);
63106311

63116312
// Save the incremented buffer position.
63126313
builder.create<fir::StoreOp>(loc, endOff, buffPos);
@@ -6356,7 +6357,9 @@ class ArrayExprLowering {
63566357
mlir::Value buffi = computeCoordinate(buff, off);
63576358
llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
63586359
builder, loc, memcpyType(), buffi, v.getAddr(), eleSz);
6359-
createCallMemcpy(args, /*isVolatile=*/false);
6360+
const bool isVolatile =
6361+
fir::isa_volatile_type(v.getAddr().getType());
6362+
createCallMemcpy(args, isVolatile);
63606363

63616364
builder.create<fir::StoreOp>(loc, plusOne, buffPos);
63626365
}
@@ -7013,7 +7016,8 @@ class ArrayExprLowering {
70137016
components.resetExtendCoorRef();
70147017
auto ptrEleTy = fir::PointerType::get(eleTy);
70157018
auto ptrAddr = builder.createConvert(loc, ptrEleTy, addr);
7016-
auto boxTy = fir::BoxType::get(ptrEleTy);
7019+
auto boxTy = fir::BoxType::get(
7020+
ptrEleTy, fir::isa_volatile_type(addr.getType()));
70177021
// FIXME: The typeparams to the load may be different than those of
70187022
// the subobject.
70197023
if (components.hasExtendCoorRef())

flang/lib/Lower/ConvertExprToHLFIR.cpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ class HlfirDesignatorBuilder {
204204
!partInfo.resultShape)
205205
partInfo.resultShape =
206206
hlfir::genShape(getLoc(), getBuilder(), *partInfo.base);
207+
207208
// Dynamic type of polymorphic base must be kept if the designator is
208209
// polymorphic.
209210
if (isPolymorphic(designatorNode))
@@ -215,7 +216,25 @@ class HlfirDesignatorBuilder {
215216
return fir::BoxCharType::get(charType.getContext(), charType.getFKind());
216217

217218
// When volatile is enabled, enable volatility on the designatory type.
218-
const bool isVolatile = false;
219+
bool isVolatile = false;
220+
221+
// Check if this should be a volatile reference
222+
if constexpr (std::is_same_v<std::decay_t<T>,
223+
Fortran::evaluate::SymbolRef>) {
224+
if (designatorNode.get().GetUltimate().attrs().test(
225+
Fortran::semantics::Attr::VOLATILE))
226+
isVolatile = true;
227+
} else if constexpr (std::is_same_v<std::decay_t<T>,
228+
Fortran::evaluate::ArrayRef>) {
229+
if (designatorNode.base().GetLastSymbol().attrs().test(
230+
Fortran::semantics::Attr::VOLATILE))
231+
isVolatile = true;
232+
} else if constexpr (std::is_same_v<std::decay_t<T>,
233+
Fortran::evaluate::Component>) {
234+
if (designatorNode.GetLastSymbol().attrs().test(
235+
Fortran::semantics::Attr::VOLATILE))
236+
isVolatile = true;
237+
}
219238

220239
// Arrays with non default lower bounds or dynamic length or dynamic extent
221240
// need a fir.box to hold the dynamic or lower bound information.
@@ -230,6 +249,12 @@ class HlfirDesignatorBuilder {
230249
/*namedConstantSectionsAreAlwaysContiguous=*/false))
231250
return fir::BoxType::get(resultValueType, isVolatile);
232251

252+
// Check if the base type is volatile
253+
if (partInfo.base.has_value()) {
254+
mlir::Type baseType = partInfo.base.value().getType();
255+
isVolatile = fir::isa_volatile_type(baseType);
256+
}
257+
233258
// Other designators can be handled as raw addresses.
234259
return fir::ReferenceType::get(resultValueType, isVolatile);
235260
}
@@ -441,7 +466,10 @@ class HlfirDesignatorBuilder {
441466
// hlfir.designate result will be a pointer/allocatable.
442467
PartInfo partInfo;
443468
mlir::Type componentType = visitComponentImpl(component, partInfo).second;
444-
mlir::Type designatorType = fir::ReferenceType::get(componentType);
469+
const auto isVolatile =
470+
fir::isa_volatile_type(partInfo.base.value().getBase().getType());
471+
mlir::Type designatorType =
472+
fir::ReferenceType::get(componentType, isVolatile);
445473
fir::FortranVariableFlagsAttr attributes =
446474
Fortran::lower::translateSymbolAttributes(getBuilder().getContext(),
447475
component.GetLastSymbol());

flang/lib/Lower/HostAssociations.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ class CapturedSimpleScalars : public CapturedSymbols<CapturedSimpleScalars> {
163163
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
164164
mlir::Type typeInTuple = fir::dyn_cast_ptrEleTy(args.addrInTuple.getType());
165165
assert(typeInTuple && "addrInTuple must be an address");
166-
mlir::Value castBox = builder.createConvert(args.loc, typeInTuple,
167-
fir::getBase(args.hostValue));
166+
mlir::Value castBox = builder.createConvertWithVolatileCast(
167+
args.loc, typeInTuple, fir::getBase(args.hostValue));
168168
builder.create<fir::StoreOp>(args.loc, castBox, args.addrInTuple);
169169
}
170170

flang/lib/Lower/IO.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,11 @@ createIoRuntimeCallForItem(Fortran::lower::AbstractConverter &converter,
836836
} else {
837837
mlir::Value itemAddr = fir::getBase(item);
838838
mlir::Type itemTy = fir::unwrapPassByRefType(itemAddr.getType());
839-
inputFuncArgs.push_back(builder.createConvert(loc, argType, itemAddr));
839+
840+
// Handle conversion between volatile and non-volatile reference types
841+
// Need to explicitly cast when volatility qualification differs
842+
inputFuncArgs.push_back(
843+
builder.createConvertWithVolatileCast(loc, argType, itemAddr));
840844
fir::factory::CharacterExprHelper charHelper{builder, loc};
841845
if (charHelper.isCharacterScalar(itemTy)) {
842846
mlir::Value len = fir::getLen(item);

flang/lib/Optimizer/Builder/Character.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,9 @@ fir::factory::CharacterExprHelper::createElementAddr(mlir::Value buffer,
271271
auto extent = fir::SequenceType::getUnknownExtent();
272272
if (charTy.getLen() != fir::CharacterType::unknownLen())
273273
extent = charTy.getLen();
274-
auto coorTy = builder.getRefType(fir::SequenceType::get({extent}, singleTy));
274+
const bool isVolatile = fir::isa_volatile_type(buffer.getType());
275+
auto sequenceType = fir::SequenceType::get({extent}, singleTy);
276+
auto coorTy = builder.getRefType(sequenceType, isVolatile);
275277

276278
auto coor = builder.createConvert(loc, coorTy, buffer);
277279
auto i = builder.createConvert(loc, builder.getIndexType(), index);
@@ -330,6 +332,8 @@ void fir::factory::CharacterExprHelper::createCopy(
330332
// If the src and dest are the same KIND, then use memmove to move the bits.
331333
// We don't have to worry about overlapping ranges with memmove.
332334
if (getCharacterKind(dest.getBuffer().getType()) == kind) {
335+
const bool isVolatile = fir::isa_volatile_type(fromBuff.getType()) ||
336+
fir::isa_volatile_type(toBuff.getType());
333337
auto bytes = builder.getKindMap().getCharacterBitsize(kind) / 8;
334338
auto i64Ty = builder.getI64Type();
335339
auto kindBytes = builder.createIntegerConstant(loc, i64Ty, bytes);
@@ -341,7 +345,7 @@ void fir::factory::CharacterExprHelper::createCopy(
341345
auto toPtr = builder.createConvert(loc, llvmPointerType, toBuff);
342346
auto fromPtr = builder.createConvert(loc, llvmPointerType, fromBuff);
343347
builder.create<mlir::LLVM::MemmoveOp>(loc, toPtr, fromPtr, totalBytes,
344-
/*isVolatile=*/false);
348+
isVolatile);
345349
return;
346350
}
347351

flang/lib/Optimizer/Builder/FIRBuilder.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,8 +615,9 @@ mlir::Value fir::FirOpBuilder::createConvert(mlir::Location loc,
615615
void fir::FirOpBuilder::createStoreWithConvert(mlir::Location loc,
616616
mlir::Value val,
617617
mlir::Value addr) {
618-
mlir::Value cast =
619-
createConvert(loc, fir::unwrapRefType(addr.getType()), val);
618+
mlir::Type unwrapedRefType = fir::unwrapRefType(addr.getType());
619+
val = createVolatileCast(loc, fir::isa_volatile_type(unwrapedRefType), val);
620+
mlir::Value cast = createConvert(loc, unwrapedRefType, val);
620621
create<fir::StoreOp>(loc, cast, addr);
621622
}
622623

flang/lib/Optimizer/Builder/HLFIRTools.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "flang/Optimizer/Builder/MutableBox.h"
1717
#include "flang/Optimizer/Builder/Runtime/Allocatable.h"
1818
#include "flang/Optimizer/Builder/Todo.h"
19+
#include "flang/Optimizer/Dialect/FIRType.h"
1920
#include "flang/Optimizer/HLFIR/HLFIROps.h"
2021
#include "mlir/IR/IRMapping.h"
2122
#include "mlir/Support/LLVM.h"

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3556,7 +3556,9 @@ struct StoreOpConversion : public fir::FIROpConversion<fir::StoreOp> {
35563556
mlir::Value llvmValue = adaptor.getValue();
35573557
mlir::Value llvmMemref = adaptor.getMemref();
35583558
mlir::LLVM::AliasAnalysisOpInterface newOp;
3559-
const bool isVolatile = fir::isa_volatile_type(store.getMemref().getType());
3559+
const bool isVolatile =
3560+
fir::isa_volatile_type(store.getMemref().getType()) ||
3561+
fir::isa_volatile_type(store.getValue().getType());
35603562
if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(storeTy)) {
35613563
mlir::Type llvmBoxTy = lowerTy().convertBoxTypeAsStruct(boxTy);
35623564
// Always use memcpy because LLVM is not as effective at optimizing
@@ -3595,6 +3597,9 @@ struct CopyOpConversion : public fir::FIROpConversion<fir::CopyOp> {
35953597
matchAndRewrite(fir::CopyOp copy, OpAdaptor adaptor,
35963598
mlir::ConversionPatternRewriter &rewriter) const override {
35973599
mlir::Location loc = copy.getLoc();
3600+
const bool isVolatile =
3601+
fir::isa_volatile_type(copy.getSource().getType()) ||
3602+
fir::isa_volatile_type(copy.getDestination().getType());
35983603
mlir::Value llvmSource = adaptor.getSource();
35993604
mlir::Value llvmDestination = adaptor.getDestination();
36003605
mlir::Type i64Ty = mlir::IntegerType::get(rewriter.getContext(), 64);
@@ -3605,10 +3610,10 @@ struct CopyOpConversion : public fir::FIROpConversion<fir::CopyOp> {
36053610
mlir::LLVM::AliasAnalysisOpInterface newOp;
36063611
if (copy.getNoOverlap())
36073612
newOp = rewriter.create<mlir::LLVM::MemcpyOp>(
3608-
loc, llvmDestination, llvmSource, copySize, /*isVolatile=*/false);
3613+
loc, llvmDestination, llvmSource, copySize, isVolatile);
36093614
else
36103615
newOp = rewriter.create<mlir::LLVM::MemmoveOp>(
3611-
loc, llvmDestination, llvmSource, copySize, /*isVolatile=*/false);
3616+
loc, llvmDestination, llvmSource, copySize, isVolatile);
36123617

36133618
// TODO: propagate TBAA once FirAliasTagOpInterface added to CopyOp.
36143619
attachTBAATag(newOp, copyTy, copyTy, nullptr);

0 commit comments

Comments
 (0)