Skip to content

Commit 52c3939

Browse files
[TableGen] Do not set ReadNone attribute on intrinsics with side effects
If an intrinsic is defined without outputs, but having side effects, it still can be removed completely from the program. This patch makes TableGen not set Attribute::ReadNone for intrinsics which are declared with IntrHasSideEffects. Differential Revision: https://reviews.llvm.org/D64414 llvm-svn: 366312
1 parent 11b0624 commit 52c3939

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// RUN: llvm-tblgen -gen-intrinsic-impl -I %p/../../include %s | FileCheck %s
2+
3+
// Get the minimum blurb necessary to process ...
4+
include "llvm/CodeGen/ValueTypes.td"
5+
include "llvm/CodeGen/SDNodeProperties.td"
6+
7+
class LLVMType<ValueType vt> {
8+
ValueType VT = vt;
9+
int isAny = 0;
10+
}
11+
12+
def llvm_i32_ty : LLVMType<i32>;
13+
14+
class IntrinsicProperty;
15+
def IntrNoMem : IntrinsicProperty;
16+
def IntrHasSideEffects : IntrinsicProperty;
17+
18+
19+
class Intrinsic<list<LLVMType> ret_types,
20+
list<LLVMType> param_types = [],
21+
list<IntrinsicProperty> intr_properties = [],
22+
string name = "",
23+
list<SDNodeProperty> sd_properties = []> : SDPatternOperator {
24+
string LLVMName = name;
25+
string TargetPrefix = "";
26+
list<LLVMType> RetTypes = ret_types;
27+
list<LLVMType> ParamTypes = param_types;
28+
list<IntrinsicProperty> IntrProperties = intr_properties;
29+
let Properties = sd_properties;
30+
31+
bit isTarget = 0;
32+
}
33+
34+
// ... this intrinsic.
35+
def int_random_gen : Intrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrHasSideEffects]>;
36+
37+
// CHECK: 1, // llvm.random.gen
38+
// CHECK: case 1:
39+
// CHECK-NEXT: Atts[] = {Attribute::NoUnwind}

llvm/utils/TableGen/CodeGenDAGPatterns.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2807,7 +2807,7 @@ TreePatternNodePtr TreePattern::ParseTreePattern(Init *TheInit,
28072807
// chain.
28082808
if (Int.IS.RetVTs.empty())
28092809
Operator = getDAGPatterns().get_intrinsic_void_sdnode();
2810-
else if (Int.ModRef != CodeGenIntrinsic::NoMem)
2810+
else if (Int.ModRef != CodeGenIntrinsic::NoMem || Int.hasSideEffects)
28112811
// Has side-effects, requires chain.
28122812
Operator = getDAGPatterns().get_intrinsic_w_chain_sdnode();
28132813
else // Otherwise, no chain.

llvm/utils/TableGen/IntrinsicEmitter.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints,
685685
}
686686

687687
if (!intrinsic.canThrow ||
688-
intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem ||
688+
(intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem && !intrinsic.hasSideEffects) ||
689689
intrinsic.isNoReturn || intrinsic.isCold || intrinsic.isNoDuplicate ||
690690
intrinsic.isConvergent || intrinsic.isSpeculatable) {
691691
OS << " const Attribute::AttrKind Atts[] = {";
@@ -727,6 +727,8 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints,
727727

728728
switch (intrinsic.ModRef) {
729729
case CodeGenIntrinsic::NoMem:
730+
if (intrinsic.hasSideEffects)
731+
break;
730732
if (addComma)
731733
OS << ",";
732734
OS << "Attribute::ReadNone";

0 commit comments

Comments
 (0)