Skip to content

Commit feda983

Browse files
committed
[TableGen] Use MemoryEffects to represent intrinsic memory effects (NFCI)
The TableGen implementation was using a homegrown implementation of FunctionModRefInfo. This switches it to use MemoryEffects instead. This makes the code simpler, and will allow exposing the full representational power of MemoryEffects in the future. Among other things, this will allow us to map IntrHasSideEffects to an inaccessiblemem readwrite, rather than just ignoring it entirely in most cases. To avoid layering issues, this moves the ModRef.h header from IR to Support, so that it can be included in the TableGen layer. Differential Revision: https://reviews.llvm.org/D137641
1 parent 49ee563 commit feda983

15 files changed

+39
-129
lines changed

llvm/include/llvm/Analysis/AliasAnalysis.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@
4242
#include "llvm/ADT/Sequence.h"
4343
#include "llvm/ADT/SmallVector.h"
4444
#include "llvm/Analysis/MemoryLocation.h"
45-
#include "llvm/IR/ModRef.h"
4645
#include "llvm/IR/PassManager.h"
4746
#include "llvm/Pass.h"
47+
#include "llvm/Support/ModRef.h"
4848
#include <cstdint>
4949
#include <functional>
5050
#include <memory>
File renamed without changes.

llvm/lib/AsmParser/LLParser.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@
3737
#include "llvm/IR/Intrinsics.h"
3838
#include "llvm/IR/LLVMContext.h"
3939
#include "llvm/IR/Metadata.h"
40-
#include "llvm/IR/ModRef.h"
4140
#include "llvm/IR/Module.h"
4241
#include "llvm/IR/Operator.h"
4342
#include "llvm/IR/Value.h"
4443
#include "llvm/IR/ValueSymbolTable.h"
4544
#include "llvm/Support/Casting.h"
4645
#include "llvm/Support/ErrorHandling.h"
4746
#include "llvm/Support/MathExtras.h"
47+
#include "llvm/Support/ModRef.h"
4848
#include "llvm/Support/SaveAndRestore.h"
4949
#include "llvm/Support/raw_ostream.h"
5050
#include <algorithm>

llvm/lib/Bitcode/Reader/BitcodeReader.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
#include "llvm/IR/IntrinsicsARM.h"
5656
#include "llvm/IR/LLVMContext.h"
5757
#include "llvm/IR/Metadata.h"
58-
#include "llvm/IR/ModRef.h"
5958
#include "llvm/IR/Module.h"
6059
#include "llvm/IR/ModuleSummaryIndex.h"
6160
#include "llvm/IR/Operator.h"
@@ -72,6 +71,7 @@
7271
#include "llvm/Support/ErrorOr.h"
7372
#include "llvm/Support/MathExtras.h"
7473
#include "llvm/Support/MemoryBuffer.h"
74+
#include "llvm/Support/ModRef.h"
7575
#include "llvm/Support/raw_ostream.h"
7676
#include <algorithm>
7777
#include <cassert>

llvm/lib/CodeGen/MachineVerifier.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@
6161
#include "llvm/IR/Function.h"
6262
#include "llvm/IR/InlineAsm.h"
6363
#include "llvm/IR/Instructions.h"
64-
#include "llvm/IR/ModRef.h"
6564
#include "llvm/InitializePasses.h"
6665
#include "llvm/MC/LaneBitmask.h"
6766
#include "llvm/MC/MCAsmInfo.h"
@@ -74,6 +73,7 @@
7473
#include "llvm/Support/ErrorHandling.h"
7574
#include "llvm/Support/LowLevelTypeImpl.h"
7675
#include "llvm/Support/MathExtras.h"
76+
#include "llvm/Support/ModRef.h"
7777
#include "llvm/Support/raw_ostream.h"
7878
#include "llvm/Target/TargetMachine.h"
7979
#include <algorithm>

llvm/lib/IR/Attributes.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
#include "llvm/Config/llvm-config.h"
2727
#include "llvm/IR/Function.h"
2828
#include "llvm/IR/LLVMContext.h"
29-
#include "llvm/IR/ModRef.h"
3029
#include "llvm/IR/Type.h"
3130
#include "llvm/Support/Compiler.h"
3231
#include "llvm/Support/ErrorHandling.h"
32+
#include "llvm/Support/ModRef.h"
3333
#include "llvm/Support/raw_ostream.h"
3434
#include <algorithm>
3535
#include <cassert>

llvm/lib/IR/Function.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
#include "llvm/IR/LLVMContext.h"
5252
#include "llvm/IR/MDBuilder.h"
5353
#include "llvm/IR/Metadata.h"
54-
#include "llvm/IR/ModRef.h"
5554
#include "llvm/IR/Module.h"
5655
#include "llvm/IR/Operator.h"
5756
#include "llvm/IR/SymbolTableListTraits.h"
@@ -64,6 +63,7 @@
6463
#include "llvm/Support/CommandLine.h"
6564
#include "llvm/Support/Compiler.h"
6665
#include "llvm/Support/ErrorHandling.h"
66+
#include "llvm/Support/ModRef.h"
6767
#include <cassert>
6868
#include <cstddef>
6969
#include <cstdint>

llvm/lib/IR/Instructions.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
#include "llvm/IR/LLVMContext.h"
3131
#include "llvm/IR/MDBuilder.h"
3232
#include "llvm/IR/Metadata.h"
33-
#include "llvm/IR/ModRef.h"
3433
#include "llvm/IR/Module.h"
3534
#include "llvm/IR/Operator.h"
3635
#include "llvm/IR/Type.h"
@@ -39,6 +38,7 @@
3938
#include "llvm/Support/Casting.h"
4039
#include "llvm/Support/ErrorHandling.h"
4140
#include "llvm/Support/MathExtras.h"
41+
#include "llvm/Support/ModRef.h"
4242
#include "llvm/Support/TypeSize.h"
4343
#include <algorithm>
4444
#include <cassert>

llvm/lib/Target/AMDGPU/AMDGPULibFunc.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
#include "llvm/ADT/StringSwitch.h"
1818
#include "llvm/IR/DerivedTypes.h"
1919
#include "llvm/IR/Function.h"
20-
#include "llvm/IR/ModRef.h"
2120
#include "llvm/IR/Module.h"
2221
#include "llvm/IR/ValueSymbolTable.h"
2322
#include "llvm/Support/CommandLine.h"
23+
#include "llvm/Support/ModRef.h"
2424
#include "llvm/Support/raw_ostream.h"
2525

2626
using namespace llvm;

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
#include "llvm/IR/IntrinsicInst.h"
3535
#include "llvm/IR/IntrinsicsAMDGPU.h"
3636
#include "llvm/IR/IntrinsicsR600.h"
37-
#include "llvm/IR/ModRef.h"
3837
#include "llvm/Support/CommandLine.h"
38+
#include "llvm/Support/ModRef.h"
3939
#include "llvm/Support/KnownBits.h"
4040

4141
using namespace llvm;

llvm/lib/Target/Mips/Mips16HardFloat.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212

1313
#include "MipsTargetMachine.h"
1414
#include "llvm/CodeGen/TargetPassConfig.h"
15-
#include "llvm/IR/ModRef.h"
1615
#include "llvm/IR/Module.h"
1716
#include "llvm/IR/Value.h"
1817
#include "llvm/Support/Debug.h"
18+
#include "llvm/Support/ModRef.h"
1919
#include "llvm/Support/raw_ostream.h"
2020
#include <algorithm>
2121
#include <string>

llvm/utils/TableGen/CodeGenDAGPatterns.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -2998,7 +2998,7 @@ TreePatternNodePtr TreePattern::ParseTreePattern(Init *TheInit,
29982998
// chain.
29992999
if (Int.IS.RetVTs.empty())
30003000
Operator = getDAGPatterns().get_intrinsic_void_sdnode();
3001-
else if (Int.ModRef != CodeGenIntrinsic::NoMem || Int.hasSideEffects)
3001+
else if (!Int.ME.doesNotAccessMemory() || Int.hasSideEffects)
30023002
// Has side-effects, requires chain.
30033003
Operator = getDAGPatterns().get_intrinsic_w_chain_sdnode();
30043004
else // Otherwise, no chain.
@@ -3637,16 +3637,17 @@ class InstAnalyzer {
36373637
if (N->NodeHasProperty(SDNPHasChain, CDP)) hasChain = true;
36383638

36393639
if (const CodeGenIntrinsic *IntInfo = N->getIntrinsicInfo(CDP)) {
3640+
ModRefInfo MR = IntInfo->ME.getModRef();
36403641
// If this is an intrinsic, analyze it.
3641-
if (IntInfo->ModRef & CodeGenIntrinsic::MR_Ref)
3642-
mayLoad = true;// These may load memory.
3642+
if (isRefSet(MR))
3643+
mayLoad = true; // These may load memory.
36433644

3644-
if (IntInfo->ModRef & CodeGenIntrinsic::MR_Mod)
3645-
mayStore = true;// Intrinsics that can write to memory are 'mayStore'.
3645+
if (isModSet(MR))
3646+
mayStore = true; // Intrinsics that can write to memory are 'mayStore'.
36463647

3647-
if (IntInfo->ModRef >= CodeGenIntrinsic::ReadWriteMem ||
3648-
IntInfo->hasSideEffects)
3649-
// ReadWriteMem intrinsics can have other strange effects.
3648+
// Consider intrinsics that don't specify any restrictions on memory
3649+
// effects as having a side-effect.
3650+
if (IntInfo->ME == MemoryEffects::unknown() || IntInfo->hasSideEffects)
36503651
hasSideEffects = true;
36513652
}
36523653
}

llvm/utils/TableGen/CodeGenIntrinsics.h

+3-45
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "SDNodeProperties.h"
1717
#include "llvm/ADT/SmallVector.h"
1818
#include "llvm/Support/MachineValueType.h"
19+
#include "llvm/Support/ModRef.h"
1920
#include <string>
2021
#include <vector>
2122

@@ -58,51 +59,8 @@ struct CodeGenIntrinsic {
5859

5960
IntrinsicSignature IS;
6061

61-
/// Bit flags describing the type (ref/mod) and location of memory
62-
/// accesses that may be performed by the intrinsics. Analogous to
63-
/// \c FunctionModRefBehaviour.
64-
enum ModRefBits {
65-
/// The intrinsic may access memory that is otherwise inaccessible via
66-
/// LLVM IR.
67-
MR_InaccessibleMem = 1,
68-
69-
/// The intrinsic may access memory through pointer arguments.
70-
/// LLVM IR.
71-
MR_ArgMem = 2,
72-
73-
/// The intrinsic may access memory anywhere, i.e. it is not restricted
74-
/// to access through pointer arguments.
75-
MR_Anywhere = 4 | MR_ArgMem | MR_InaccessibleMem,
76-
77-
/// The intrinsic may read memory.
78-
MR_Ref = 8,
79-
80-
/// The intrinsic may write memory.
81-
MR_Mod = 16,
82-
83-
/// The intrinsic may both read and write memory.
84-
MR_ModRef = MR_Ref | MR_Mod,
85-
};
86-
87-
/// Memory mod/ref behavior of this intrinsic, corresponding to intrinsic
88-
/// properties (IntrReadMem, IntrArgMemOnly, etc.).
89-
enum ModRefBehavior {
90-
NoMem = 0,
91-
ReadArgMem = MR_Ref | MR_ArgMem,
92-
ReadInaccessibleMem = MR_Ref | MR_InaccessibleMem,
93-
ReadInaccessibleMemOrArgMem = MR_Ref | MR_ArgMem | MR_InaccessibleMem,
94-
ReadMem = MR_Ref | MR_Anywhere,
95-
WriteArgMem = MR_Mod | MR_ArgMem,
96-
WriteInaccessibleMem = MR_Mod | MR_InaccessibleMem,
97-
WriteInaccessibleMemOrArgMem = MR_Mod | MR_ArgMem | MR_InaccessibleMem,
98-
WriteMem = MR_Mod | MR_Anywhere,
99-
ReadWriteArgMem = MR_ModRef | MR_ArgMem,
100-
ReadWriteInaccessibleMem = MR_ModRef | MR_InaccessibleMem,
101-
ReadWriteInaccessibleMemOrArgMem = MR_ModRef | MR_ArgMem |
102-
MR_InaccessibleMem,
103-
ReadWriteMem = MR_ModRef | MR_Anywhere,
104-
};
105-
ModRefBehavior ModRef;
62+
/// Memory effects of the intrinsic.
63+
MemoryEffects ME = MemoryEffects::unknown();
10664

10765
/// SDPatternOperator Properties applied to the intrinsic.
10866
unsigned Properties;

llvm/utils/TableGen/CodeGenTarget.cpp

+8-10
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,6 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R,
668668
TheDef = R;
669669
std::string DefName = std::string(R->getName());
670670
ArrayRef<SMLoc> DefLoc = R->getLoc();
671-
ModRef = ReadWriteMem;
672671
Properties = 0;
673672
isOverloaded = false;
674673
isCommutative = false;
@@ -842,26 +841,25 @@ void CodeGenIntrinsic::setDefaultProperties(
842841

843842
void CodeGenIntrinsic::setProperty(Record *R) {
844843
if (R->getName() == "IntrNoMem")
845-
ModRef = NoMem;
844+
ME = MemoryEffects::none();
846845
else if (R->getName() == "IntrReadMem") {
847-
if (!(ModRef & MR_Ref))
846+
if (ME.onlyWritesMemory())
848847
PrintFatalError(TheDef->getLoc(),
849848
Twine("IntrReadMem cannot be used after IntrNoMem or "
850849
"IntrWriteMem. Default is ReadWrite"));
851-
ModRef = ModRefBehavior(ModRef & ~MR_Mod);
850+
ME &= MemoryEffects::readOnly();
852851
} else if (R->getName() == "IntrWriteMem") {
853-
if (!(ModRef & MR_Mod))
852+
if (ME.onlyReadsMemory())
854853
PrintFatalError(TheDef->getLoc(),
855854
Twine("IntrWriteMem cannot be used after IntrNoMem or "
856855
"IntrReadMem. Default is ReadWrite"));
857-
ModRef = ModRefBehavior(ModRef & ~MR_Ref);
856+
ME &= MemoryEffects::writeOnly();
858857
} else if (R->getName() == "IntrArgMemOnly")
859-
ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_ArgMem);
858+
ME &= MemoryEffects::argMemOnly();
860859
else if (R->getName() == "IntrInaccessibleMemOnly")
861-
ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_InaccessibleMem);
860+
ME &= MemoryEffects::inaccessibleMemOnly();
862861
else if (R->getName() == "IntrInaccessibleMemOrArgMemOnly")
863-
ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_ArgMem |
864-
MR_InaccessibleMem);
862+
ME &= MemoryEffects::inaccessibleOrArgMemOnly();
865863
else if (R->getName() == "Commutative")
866864
isCommutative = true;
867865
else if (R->getName() == "Throws")

llvm/utils/TableGen/IntrinsicEmitter.cpp

+9-56
Original file line numberDiff line numberDiff line change
@@ -642,8 +642,8 @@ Optional<bool> compareFnAttributes(const CodeGenIntrinsic *L,
642642
return R->hasSideEffects;
643643

644644
// Try to order by readonly/readnone attribute.
645-
CodeGenIntrinsic::ModRefBehavior LK = L->ModRef;
646-
CodeGenIntrinsic::ModRefBehavior RK = R->ModRef;
645+
uint32_t LK = L->ME.toIntValue();
646+
uint32_t RK = R->ME.toIntValue();
647647
if (LK != RK) return (LK > RK);
648648

649649
return None;
@@ -772,60 +772,13 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints,
772772
if (Intrinsic.isSpeculatable)
773773
OS << " Attribute::get(C, Attribute::Speculatable),\n";
774774

775-
switch (Intrinsic.ModRef) {
776-
case CodeGenIntrinsic::NoMem:
777-
if (Intrinsic.hasSideEffects)
778-
break;
775+
MemoryEffects ME = Intrinsic.ME;
776+
// TODO: IntrHasSideEffects should affect not only readnone intrinsics.
777+
if (ME.doesNotAccessMemory() && Intrinsic.hasSideEffects)
778+
ME = MemoryEffects::unknown();
779+
if (ME != MemoryEffects::unknown()) {
779780
OS << " Attribute::getWithMemoryEffects(C, "
780-
<< "MemoryEffects::none()),\n";
781-
break;
782-
case CodeGenIntrinsic::ReadArgMem:
783-
OS << " Attribute::getWithMemoryEffects(C, "
784-
<< "MemoryEffects::argMemOnly(ModRefInfo::Ref)),\n";
785-
break;
786-
case CodeGenIntrinsic::ReadMem:
787-
OS << " Attribute::getWithMemoryEffects(C, "
788-
<< "MemoryEffects::readOnly()),\n";
789-
break;
790-
case CodeGenIntrinsic::ReadInaccessibleMem:
791-
OS << " Attribute::getWithMemoryEffects(C, "
792-
<< "MemoryEffects::inaccessibleMemOnly(ModRefInfo::Ref)),\n";
793-
break;
794-
case CodeGenIntrinsic::ReadInaccessibleMemOrArgMem:
795-
OS << " Attribute::getWithMemoryEffects(C, "
796-
<< "MemoryEffects::inaccessibleOrArgMemOnly(ModRefInfo::Ref)),\n";
797-
break;
798-
break;
799-
case CodeGenIntrinsic::WriteArgMem:
800-
OS << " Attribute::getWithMemoryEffects(C, "
801-
<< "MemoryEffects::argMemOnly(ModRefInfo::Mod)),\n";
802-
break;
803-
case CodeGenIntrinsic::WriteMem:
804-
OS << " Attribute::getWithMemoryEffects(C, "
805-
<< "MemoryEffects::writeOnly()),\n";
806-
break;
807-
case CodeGenIntrinsic::WriteInaccessibleMem:
808-
OS << " Attribute::getWithMemoryEffects(C, "
809-
<< "MemoryEffects::inaccessibleMemOnly(ModRefInfo::Mod)),\n";
810-
break;
811-
case CodeGenIntrinsic::WriteInaccessibleMemOrArgMem:
812-
OS << " Attribute::getWithMemoryEffects(C, "
813-
<< "MemoryEffects::inaccessibleOrArgMemOnly(ModRefInfo::Mod)),\n";
814-
break;
815-
case CodeGenIntrinsic::ReadWriteArgMem:
816-
OS << " Attribute::getWithMemoryEffects(C, "
817-
<< "MemoryEffects::argMemOnly(ModRefInfo::ModRef)),\n";
818-
break;
819-
case CodeGenIntrinsic::ReadWriteInaccessibleMem:
820-
OS << " Attribute::getWithMemoryEffects(C, "
821-
<< "MemoryEffects::inaccessibleMemOnly(ModRefInfo::ModRef)),\n";
822-
break;
823-
case CodeGenIntrinsic::ReadWriteInaccessibleMemOrArgMem:
824-
OS << " Attribute::getWithMemoryEffects(C, "
825-
<< "MemoryEffects::inaccessibleOrArgMemOnly(ModRefInfo::ModRef)),\n";
826-
break;
827-
case CodeGenIntrinsic::ReadWriteMem:
828-
break;
781+
<< "MemoryEffects::createFromIntValue(" << ME.toIntValue() << ")),\n";
829782
}
830783
OS << " });\n";
831784
}
@@ -885,7 +838,7 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints,
885838
}
886839

887840
if (!Intrinsic.canThrow ||
888-
(Intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem &&
841+
(Intrinsic.ME != MemoryEffects::unknown() &&
889842
!Intrinsic.hasSideEffects) ||
890843
Intrinsic.isNoReturn || Intrinsic.isNoCallback || Intrinsic.isNoSync ||
891844
Intrinsic.isNoFree || Intrinsic.isWillReturn || Intrinsic.isCold ||

0 commit comments

Comments
 (0)