mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[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
This commit is contained in:
parent
13bc103972
commit
2e592185f9
39
test/TableGen/intrin-side-effects.td
Normal file
39
test/TableGen/intrin-side-effects.td
Normal file
@ -0,0 +1,39 @@
|
||||
// RUN: llvm-tblgen -gen-intrinsic-impl -I %p/../../include %s | FileCheck %s
|
||||
|
||||
// Get the minimum blurb necessary to process ...
|
||||
include "llvm/CodeGen/ValueTypes.td"
|
||||
include "llvm/CodeGen/SDNodeProperties.td"
|
||||
|
||||
class LLVMType<ValueType vt> {
|
||||
ValueType VT = vt;
|
||||
int isAny = 0;
|
||||
}
|
||||
|
||||
def llvm_i32_ty : LLVMType<i32>;
|
||||
|
||||
class IntrinsicProperty;
|
||||
def IntrNoMem : IntrinsicProperty;
|
||||
def IntrHasSideEffects : IntrinsicProperty;
|
||||
|
||||
|
||||
class Intrinsic<list<LLVMType> ret_types,
|
||||
list<LLVMType> param_types = [],
|
||||
list<IntrinsicProperty> intr_properties = [],
|
||||
string name = "",
|
||||
list<SDNodeProperty> sd_properties = []> : SDPatternOperator {
|
||||
string LLVMName = name;
|
||||
string TargetPrefix = "";
|
||||
list<LLVMType> RetTypes = ret_types;
|
||||
list<LLVMType> ParamTypes = param_types;
|
||||
list<IntrinsicProperty> IntrProperties = intr_properties;
|
||||
let Properties = sd_properties;
|
||||
|
||||
bit isTarget = 0;
|
||||
}
|
||||
|
||||
// ... this intrinsic.
|
||||
def int_random_gen : Intrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrHasSideEffects]>;
|
||||
|
||||
// CHECK: 1, // llvm.random.gen
|
||||
// CHECK: case 1:
|
||||
// CHECK-NEXT: Atts[] = {Attribute::NoUnwind}
|
@ -2807,7 +2807,7 @@ TreePatternNodePtr TreePattern::ParseTreePattern(Init *TheInit,
|
||||
// chain.
|
||||
if (Int.IS.RetVTs.empty())
|
||||
Operator = getDAGPatterns().get_intrinsic_void_sdnode();
|
||||
else if (Int.ModRef != CodeGenIntrinsic::NoMem)
|
||||
else if (Int.ModRef != CodeGenIntrinsic::NoMem || Int.hasSideEffects)
|
||||
// Has side-effects, requires chain.
|
||||
Operator = getDAGPatterns().get_intrinsic_w_chain_sdnode();
|
||||
else // Otherwise, no chain.
|
||||
|
@ -685,7 +685,7 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints,
|
||||
}
|
||||
|
||||
if (!intrinsic.canThrow ||
|
||||
intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem ||
|
||||
(intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem && !intrinsic.hasSideEffects) ||
|
||||
intrinsic.isNoReturn || intrinsic.isCold || intrinsic.isNoDuplicate ||
|
||||
intrinsic.isConvergent || intrinsic.isSpeculatable) {
|
||||
OS << " const Attribute::AttrKind Atts[] = {";
|
||||
@ -727,6 +727,8 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints,
|
||||
|
||||
switch (intrinsic.ModRef) {
|
||||
case CodeGenIntrinsic::NoMem:
|
||||
if (intrinsic.hasSideEffects)
|
||||
break;
|
||||
if (addComma)
|
||||
OS << ",";
|
||||
OS << "Attribute::ReadNone";
|
||||
|
Loading…
Reference in New Issue
Block a user