Index: llvm/test/TableGen/intrin-side-effects.td =================================================================== --- llvm/test/TableGen/intrin-side-effects.td +++ llvm/test/TableGen/intrin-side-effects.td @@ -9,7 +9,18 @@ int isAny = 0; } +class LLVMQualPointerType + : LLVMType{ + LLVMType ElTy = elty; + int AddrSpace = addrspace; +} + +class LLVMPointerType + : LLVMQualPointerType; + +def llvm_i8_ty : LLVMType; def llvm_i32_ty : LLVMType; +def llvm_ptr_ty : LLVMPointerType; class IntrinsicProperty { bit IsDefault = is_default; @@ -17,6 +28,10 @@ def IntrNoMem : IntrinsicProperty; def IntrHasSideEffects : IntrinsicProperty; +def IntrReadMem : IntrinsicProperty; +def IntrArgMemOnly : IntrinsicProperty; +def IntrInaccessibleMemOnly : IntrinsicProperty; +def IntrInaccessibleMemOrArgMemOnly : IntrinsicProperty; class Intrinsic ret_types, list param_types = [], @@ -37,9 +52,38 @@ bit DisableDefaultAttributes = disable_default_attributes; } -// ... this intrinsic. -def int_random_gen : Intrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrHasSideEffects]>; +// ... these intrinsic. + +// CHECK: 1, // llvm.random.gen.no.mem +// CHECK: 2, // llvm.random.gen.read.arg.mem +// CHECK: 3, // llvm.random.gen.read.inaccessible.mem +// CHECK: 4, // llvm.random.gen.read.inaccessible.mem.or.arg.mem +// CHECK: 5, // llvm.random.gen.read.mem + +// CHECK: case 5: +// CHECK-NEXT: Atts[] = {Attribute::NoUnwind} +def int_random_gen_read_mem + : Intrinsic<[llvm_i32_ty], [], [IntrReadMem, IntrHasSideEffects]>; + +// CHECK: case 4: +// CHECK-NEXT: Atts[] = {Attribute::NoUnwind} +def int_random_gen_read_inaccessible_mem_or_arg_mem + : Intrinsic<[llvm_i32_ty], [], [IntrReadMem,IntrInaccessibleMemOrArgMemOnly, + IntrHasSideEffects]>; + +// CHECK: case 2: +// CHECK-NEXT: Atts[] = {Attribute::NoUnwind} +def int_random_gen_read_arg_mem + : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly, + IntrHasSideEffects]>; + +// CHECK: case 3: +// CHECK-NEXT: Atts[] = {Attribute::NoUnwind} +def int_random_gen_read_inaccessible_mem + : Intrinsic<[llvm_i32_ty], [], [IntrReadMem, IntrInaccessibleMemOnly, + IntrHasSideEffects]>; -// CHECK: 1, // llvm.random.gen // CHECK: case 1: // CHECK-NEXT: Atts[] = {Attribute::NoUnwind} +def int_random_gen_no_mem + : Intrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrHasSideEffects]>; Index: llvm/utils/TableGen/IntrinsicEmitter.cpp =================================================================== --- llvm/utils/TableGen/IntrinsicEmitter.cpp +++ llvm/utils/TableGen/IntrinsicEmitter.cpp @@ -833,23 +833,31 @@ OS << "Attribute::ReadNone"; break; case CodeGenIntrinsic::ReadArgMem: + if (intrinsic.hasSideEffects) + break; if (addComma) OS << ","; OS << "Attribute::ReadOnly,"; OS << "Attribute::ArgMemOnly"; break; case CodeGenIntrinsic::ReadMem: + if (intrinsic.hasSideEffects) + break; if (addComma) OS << ","; OS << "Attribute::ReadOnly"; break; case CodeGenIntrinsic::ReadInaccessibleMem: + if (intrinsic.hasSideEffects) + break; if (addComma) OS << ","; OS << "Attribute::ReadOnly,"; OS << "Attribute::InaccessibleMemOnly"; break; case CodeGenIntrinsic::ReadInaccessibleMemOrArgMem: + if (intrinsic.hasSideEffects) + break; if (addComma) OS << ","; OS << "Attribute::ReadOnly,";