[llvm] r366312 - [TableGen] Do not set ReadNone attribute on intrinsics with side effects

Momchil Velikov via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 17 03:53:13 PDT 2019


Author: chill
Date: Wed Jul 17 03:53:13 2019
New Revision: 366312

URL: http://llvm.org/viewvc/llvm-project?rev=366312&view=rev
Log:
[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

Added:
    llvm/trunk/test/TableGen/intrin-side-effects.td
Modified:
    llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
    llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp

Added: llvm/trunk/test/TableGen/intrin-side-effects.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/intrin-side-effects.td?rev=366312&view=auto
==============================================================================
--- llvm/trunk/test/TableGen/intrin-side-effects.td (added)
+++ llvm/trunk/test/TableGen/intrin-side-effects.td Wed Jul 17 03:53:13 2019
@@ -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}

Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=366312&r1=366311&r2=366312&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original)
+++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Wed Jul 17 03:53:13 2019
@@ -2807,7 +2807,7 @@ TreePatternNodePtr TreePattern::ParseTre
     // 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.

Modified: llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp?rev=366312&r1=366311&r2=366312&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp Wed Jul 17 03:53:13 2019
@@ -685,7 +685,7 @@ void IntrinsicEmitter::EmitAttributes(co
     }
 
     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(co
 
       switch (intrinsic.ModRef) {
       case CodeGenIntrinsic::NoMem:
+        if (intrinsic.hasSideEffects)
+          break;
         if (addComma)
           OS << ",";
         OS << "Attribute::ReadNone";




More information about the llvm-commits mailing list