Skip to content

Commit fca533a

Browse files
Move tests and support routines
1 parent 7bcd697 commit fca533a

File tree

5 files changed

+30
-35
lines changed

5 files changed

+30
-35
lines changed

flang/include/flang/Optimizer/Dialect/FIROpsSupport.h

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,25 @@
1515

1616
namespace fir {
1717

18-
/// Return true iff the Operation is a non-volatile LoadOp or ArrayLoadOp.
19-
inline bool nonVolatileLoad(mlir::Operation *op) {
20-
if (auto load = mlir::dyn_cast<fir::LoadOp>(op))
21-
return !load->getAttr("volatile");
22-
if (auto arrLoad = mlir::dyn_cast<fir::ArrayLoadOp>(op))
23-
return !arrLoad->getAttr("volatile");
24-
return false;
18+
/// The LLVM dialect represents volatile memory accesses as read and write
19+
/// effects to an unknown memory location, but this may be overly conservative.
20+
/// LLVM Language Reference only specifies that volatile memory accesses
21+
/// must not be reordered relative to other volatile memory accesses, so it
22+
/// is more precise to use a separate memory resource for volatile memory
23+
/// accesses.
24+
inline void addVolatileMemoryEffects(
25+
mlir::TypeRange type,
26+
llvm::SmallVectorImpl<
27+
mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>
28+
&effects) {
29+
for (mlir::Type t : type) {
30+
if (fir::isa_volatile_type(t)) {
31+
effects.emplace_back(mlir::MemoryEffects::Read::get(),
32+
fir::VolatileMemoryResource::get());
33+
effects.emplace_back(mlir::MemoryEffects::Write::get(),
34+
fir::VolatileMemoryResource::get());
35+
}
36+
}
2537
}
2638

2739
/// Return true iff the Operation is a call.

flang/lib/Optimizer/Dialect/FIROps.cpp

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "mlir/IR/Matchers.h"
3131
#include "mlir/IR/OpDefinition.h"
3232
#include "mlir/IR/PatternMatch.h"
33+
#include "mlir/IR/TypeRange.h"
3334
#include "llvm/ADT/STLExtras.h"
3435
#include "llvm/ADT/SmallVector.h"
3536
#include "llvm/ADT/TypeSwitch.h"
@@ -38,24 +39,6 @@ namespace {
3839
#include "flang/Optimizer/Dialect/CanonicalizationPatterns.inc"
3940
} // namespace
4041

41-
/// Volatile references are currently modeled as read and write effects
42-
/// to an unknown memory location. This is how the LLVM dialect models
43-
/// volatile memory accesses, but may be overly conservative. LLVM
44-
/// Language Reference only specifies that volatile memory accesses
45-
/// must not be reordered relative to other volatile memory accesses,
46-
/// so it would be more precise to use a separate memory resource for
47-
/// volatile memory accesses. Be conservative for now.
48-
static void addVolatileMemoryEffects(
49-
mlir::Type type, llvm::SmallVectorImpl<mlir::SideEffects::EffectInstance<
50-
mlir::MemoryEffects::Effect>> &effects) {
51-
if (fir::isa_volatile_type(type)) {
52-
effects.emplace_back(mlir::MemoryEffects::Read::get(),
53-
fir::VolatileMemoryResource::get());
54-
effects.emplace_back(mlir::MemoryEffects::Write::get(),
55-
fir::VolatileMemoryResource::get());
56-
}
57-
}
58-
5942
static void propagateAttributes(mlir::Operation *fromOp,
6043
mlir::Operation *toOp) {
6144
if (!fromOp || !toOp)
@@ -879,7 +862,7 @@ void fir::ArrayLoadOp::getEffects(
879862
effects.emplace_back(mlir::MemoryEffects::Read::get(),
880863
&getOperation()->getOpOperand(0),
881864
mlir::SideEffects::DefaultResource::get());
882-
addVolatileMemoryEffects(getMemref().getType(), effects);
865+
addVolatileMemoryEffects({getMemref().getType()}, effects);
883866
}
884867

885868
llvm::LogicalResult fir::ArrayLoadOp::verify() {
@@ -971,7 +954,7 @@ void fir::ArrayMergeStoreOp::getEffects(
971954
effects.emplace_back(mlir::MemoryEffects::Write::get(),
972955
&getOperation()->getOpOperand(0),
973956
mlir::SideEffects::DefaultResource::get());
974-
addVolatileMemoryEffects(getMemref().getType(), effects);
957+
addVolatileMemoryEffects({getMemref().getType()}, effects);
975958
}
976959

977960
//===----------------------------------------------------------------------===//
@@ -1855,6 +1838,9 @@ llvm::LogicalResult fir::EmboxOp::verify() {
18551838
return emitOpError("slice must not be provided for a scalar");
18561839
if (getSourceBox() && !mlir::isa<fir::ClassType>(getResult().getType()))
18571840
return emitOpError("source_box must be used with fir.class result type");
1841+
if (fir::isa_volatile_type(getMemref().getType()) !=
1842+
fir::isa_volatile_type(getResult().getType()))
1843+
return emitOpError("input and output types must have the same volatility");
18581844
return mlir::success();
18591845
}
18601846

@@ -2674,7 +2660,7 @@ void fir::LoadOp::getEffects(
26742660
effects.emplace_back(mlir::MemoryEffects::Read::get(),
26752661
&getOperation()->getOpOperand(0),
26762662
mlir::SideEffects::DefaultResource::get());
2677-
addVolatileMemoryEffects(getMemref().getType(), effects);
2663+
addVolatileMemoryEffects({getMemref().getType()}, effects);
26782664
}
26792665

26802666
//===----------------------------------------------------------------------===//
@@ -4036,7 +4022,7 @@ void fir::StoreOp::getEffects(
40364022
effects.emplace_back(mlir::MemoryEffects::Write::get(),
40374023
&getOperation()->getOpOperand(1),
40384024
mlir::SideEffects::DefaultResource::get());
4039-
addVolatileMemoryEffects(getMemref().getType(), effects);
4025+
addVolatileMemoryEffects({getMemref().getType()}, effects);
40404026
}
40414027

40424028
//===----------------------------------------------------------------------===//
@@ -4069,8 +4055,8 @@ void fir::CopyOp::getEffects(
40694055
effects.emplace_back(mlir::MemoryEffects::Write::get(),
40704056
&getOperation()->getOpOperand(1),
40714057
mlir::SideEffects::DefaultResource::get());
4072-
addVolatileMemoryEffects(getDestination().getType(), effects);
4073-
addVolatileMemoryEffects(getSource().getType(), effects);
4058+
addVolatileMemoryEffects({getDestination().getType(), getSource().getType()},
4059+
effects);
40744060
}
40754061

40764062
//===----------------------------------------------------------------------===//

flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,7 @@ void hlfir::AssignOp::getEffects(
170170
}
171171
}
172172

173-
if (fir::isa_volatile_type(lhsType) || fir::isa_volatile_type(rhsType)) {
174-
effects.emplace_back(mlir::MemoryEffects::Read::get());
175-
effects.emplace_back(mlir::MemoryEffects::Write::get());
176-
}
173+
fir::addVolatileMemoryEffects({lhsType, rhsType}, effects);
177174

178175
if (getRealloc()) {
179176
// Reallocation of the data cannot be precisely described by this API.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)