//===- UBOps.td - UB operations definitions ----------------*- tablegen -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef MLIR_DIALECT_UB_IR_UBOPS_TD #define MLIR_DIALECT_UB_IR_UBOPS_TD include "mlir/Interfaces/SideEffectInterfaces.td" include "mlir/IR/AttrTypeBase.td" include "mlir/Dialect/UB/IR/UBOpsInterfaces.td" def UB_Dialect : Dialect { let name = "ub"; let cppNamespace = "::mlir::ub"; let hasConstantMaterializer = 1; let useDefaultAttributePrinterParser = 1; } // Base class for UB dialect attributes. class UB_Attr traits = []> : AttrDef { let mnemonic = attrMnemonic; } // Base class for UB dialect ops. class UB_Op traits = []> : Op; def PoisonAttr : UB_Attr<"Poison", "poison", [PoisonAttrInterface]> { } //===----------------------------------------------------------------------===// // PoisonOp //===----------------------------------------------------------------------===// def PoisonOp : UB_Op<"poison", [ConstantLike, Pure]> { let summary = "Poisoned constant operation."; let description = [{ The `poison` operation materializes a compile-time poisoned constant value to indicate deferred undefined behavior. `value` attribute is needed to indicate an optional additional poison semantics (e.g. partially poisoned vectors), default value indicates results is fully poisoned. Examples: ``` // Short form %0 = ub.poison : i32 // Long form %1 = ub.poison <#custom_poison_elements_attr> : vector<4xi64> ``` }]; let arguments = (ins DefaultValuedAttr:$value); let results = (outs AnyType:$result); let assemblyFormat = "attr-dict (`<` $value^ `>`)? `:` type($result)"; let hasFolder = 1; } //===----------------------------------------------------------------------===// // UnreachableOp //===----------------------------------------------------------------------===// def UnreachableOp : UB_Op<"unreachable", [Terminator]> { let summary = "Unreachable operation."; let description = [{ The `unreachable` operation triggers immediate undefined behavior if executed. Example: ``` ub.unreachable ``` }]; let assemblyFormat = "attr-dict"; } #endif // MLIR_DIALECT_UB_IR_UBOPS_TD