[llvm] r252811 - [IR] Add support for empty tokens

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 13 23:11:34 PST 2015


Did you try something along the lines of:
diff --git a/lib/IR/LLVMContextImpl.cpp b/lib/IR/LLVMContextImpl.cpp
index 48df5ba..f4eefea 100644
--- a/lib/IR/LLVMContextImpl.cpp
+++ b/lib/IR/LLVMContextImpl.cpp
@@ -118,6 +118,7 @@ LLVMContextImpl::~LLVMContextImpl() {
   InlineAsms.freeConstants();
   DeleteContainerSeconds(IntConstants);
   DeleteContainerSeconds(FPConstants);
+  delete TheNoneToken;

   for (StringMap<ConstantDataSequential*>::iterator I =
CDSConstants.begin(),
        E = CDSConstants.end(); I != E; ++I)

If so, why was this not sufficient?  If not, do you have any reason to
believe why this wouldn't be sufficient?

On Fri, Nov 13, 2015 at 2:06 PM, Reid Kleckner <rnk at google.com> wrote:

> We end up leaking TheNoneToken. I took a look, but fixing it wasn't
> straightforward.
>
> On Wed, Nov 11, 2015 at 1:57 PM, David Majnemer via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: majnemer
>> Date: Wed Nov 11 15:57:16 2015
>> New Revision: 252811
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=252811&view=rev
>> Log:
>> [IR] Add support for empty tokens
>>
>> When working with tokens, it is often the case that one has instructions
>> which consume a token and produce a new token.  Currently, we have no
>> mechanism to represent an initial token state.
>>
>> Instead, we can create a notional "empty token" by inventing a new
>> constant which captures the semantics we would like.  This new constant
>> is called ConstantTokenNone and is written textually as "token none".
>>
>> Differential Revision: http://reviews.llvm.org/D14581
>>
>> Modified:
>>     llvm/trunk/docs/LangRef.rst
>>     llvm/trunk/include/llvm-c/Core.h
>>     llvm/trunk/include/llvm/IR/Constants.h
>>     llvm/trunk/include/llvm/IR/Value.def
>>     llvm/trunk/lib/AsmParser/LLLexer.cpp
>>     llvm/trunk/lib/AsmParser/LLParser.cpp
>>     llvm/trunk/lib/AsmParser/LLParser.h
>>     llvm/trunk/lib/AsmParser/LLToken.h
>>     llvm/trunk/lib/IR/AsmWriter.cpp
>>     llvm/trunk/lib/IR/Constants.cpp
>>     llvm/trunk/lib/IR/LLVMContextImpl.cpp
>>     llvm/trunk/lib/IR/LLVMContextImpl.h
>>     llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp
>>     llvm/trunk/test/Assembler/token.ll
>>
>> Modified: llvm/trunk/docs/LangRef.rst
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/docs/LangRef.rst (original)
>> +++ llvm/trunk/docs/LangRef.rst Wed Nov 11 15:57:16 2015
>> @@ -2434,6 +2434,9 @@ Simple Constants
>>  **Null pointer constants**
>>      The identifier '``null``' is recognized as a null pointer constant
>>      and must be of :ref:`pointer type <t_pointer>`.
>> +**Token constants**
>> +    The identifier '``none``' is recognized as an empty token constant
>> +    and must be of :ref:`token type <t_token>`.
>>
>>  The one non-intuitive notation for constants is the hexadecimal form of
>>  floating point constants. For example, the form
>>
>> Modified: llvm/trunk/include/llvm-c/Core.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/Core.h (original)
>> +++ llvm/trunk/include/llvm-c/Core.h Wed Nov 11 15:57:16 2015
>> @@ -1185,6 +1185,7 @@ LLVMTypeRef LLVMX86MMXType(void);
>>        macro(ConstantInt)                    \
>>        macro(ConstantPointerNull)            \
>>        macro(ConstantStruct)                 \
>> +      macro(ConstantTokenNone)              \
>>        macro(ConstantVector)                 \
>>        macro(GlobalValue)                    \
>>          macro(GlobalAlias)                  \
>>
>> Modified: llvm/trunk/include/llvm/IR/Constants.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Constants.h?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/IR/Constants.h (original)
>> +++ llvm/trunk/include/llvm/IR/Constants.h Wed Nov 11 15:57:16 2015
>> @@ -795,7 +795,32 @@ public:
>>    }
>>  };
>>
>>
>> +//===----------------------------------------------------------------------===//
>> +/// ConstantTokenNone - a constant token which is empty
>> +///
>> +class ConstantTokenNone : public Constant {
>> +  void *operator new(size_t, unsigned) = delete;
>> +  ConstantTokenNone(const ConstantTokenNone &) = delete;
>> +
>> +  friend class Constant;
>> +  void destroyConstantImpl();
>> +  Value *handleOperandChangeImpl(Value *From, Value *To, Use *U);
>> +
>> +protected:
>> +  explicit ConstantTokenNone(LLVMContext &Context)
>> +      : Constant(Type::getTokenTy(Context), ConstantTokenNoneVal,
>> nullptr, 0) {}
>> +  // allocate space for exactly zero operands
>> +  void *operator new(size_t s) { return User::operator new(s, 0); }
>>
>> +public:
>> +  /// Return the ConstantTokenNone.
>> +  static ConstantTokenNone *get(LLVMContext &Context);
>> +
>> +  /// @brief Methods to support type inquiry through isa, cast, and
>> dyn_cast.
>> +  static bool classof(const Value *V) {
>> +    return V->getValueID() == ConstantTokenNoneVal;
>> +  }
>> +};
>>
>>  /// BlockAddress - The address of a basic block.
>>  ///
>>
>> Modified: llvm/trunk/include/llvm/IR/Value.def
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Value.def?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/IR/Value.def (original)
>> +++ llvm/trunk/include/llvm/IR/Value.def Wed Nov 11 15:57:16 2015
>> @@ -70,6 +70,7 @@ HANDLE_CONSTANT(ConstantArray)
>>  HANDLE_CONSTANT(ConstantStruct)
>>  HANDLE_CONSTANT(ConstantVector)
>>  HANDLE_CONSTANT(ConstantPointerNull)
>> +HANDLE_CONSTANT(ConstantTokenNone)
>>
>>  HANDLE_METADATA_VALUE(MetadataAsValue)
>>  HANDLE_INLINE_ASM_VALUE(InlineAsm)
>> @@ -79,7 +80,7 @@ HANDLE_INSTRUCTION(Instruction)
>>  // don't add new values here!
>>
>>  HANDLE_CONSTANT_MARKER(ConstantFirstVal, Function)
>> -HANDLE_CONSTANT_MARKER(ConstantLastVal, ConstantPointerNull)
>> +HANDLE_CONSTANT_MARKER(ConstantLastVal, ConstantTokenNone)
>>
>>  #undef HANDLE_GLOBAL_VALUE
>>  #undef HANDLE_CONSTANT
>>
>> Modified: llvm/trunk/lib/AsmParser/LLLexer.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLLexer.cpp?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLLexer.cpp (original)
>> +++ llvm/trunk/lib/AsmParser/LLLexer.cpp Wed Nov 11 15:57:16 2015
>> @@ -523,6 +523,7 @@ lltok::Kind LLLexer::LexIdentifier() {
>>    KEYWORD(zeroinitializer);
>>    KEYWORD(undef);
>>    KEYWORD(null);
>> +  KEYWORD(none);
>>    KEYWORD(to);
>>    KEYWORD(caller);
>>    KEYWORD(tail);
>>
>> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
>> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Wed Nov 11 15:57:16 2015
>> @@ -2622,6 +2622,7 @@ bool LLParser::ParseValID(ValID &ID, Per
>>    case lltok::kw_null: ID.Kind = ValID::t_Null; break;
>>    case lltok::kw_undef: ID.Kind = ValID::t_Undef; break;
>>    case lltok::kw_zeroinitializer: ID.Kind = ValID::t_Zero; break;
>> +  case lltok::kw_none: ID.Kind = ValID::t_None; break;
>>
>>    case lltok::lbrace: {
>>      // ValID ::= '{' ConstVector '}'
>> @@ -4255,6 +4256,11 @@ bool LLParser::ConvertValIDToValue(Type
>>        return Error(ID.Loc, "invalid type for null constant");
>>      V = Constant::getNullValue(Ty);
>>      return false;
>> +  case ValID::t_None:
>> +    if (!Ty->isTokenTy())
>> +      return Error(ID.Loc, "invalid type for none constant");
>> +    V = Constant::getNullValue(Ty);
>> +    return false;
>>    case ValID::t_Constant:
>>      if (ID.ConstantVal->getType() != Ty)
>>        return Error(ID.Loc, "constant expression type mismatch");
>>
>> Modified: llvm/trunk/lib/AsmParser/LLParser.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.h?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLParser.h (original)
>> +++ llvm/trunk/lib/AsmParser/LLParser.h Wed Nov 11 15:57:16 2015
>> @@ -46,15 +46,15 @@ namespace llvm {
>>    /// or a symbolic (%var) reference.  This is just a discriminated
>> union.
>>    struct ValID {
>>      enum {
>> -      t_LocalID, t_GlobalID,      // ID in UIntVal.
>> -      t_LocalName, t_GlobalName,  // Name in StrVal.
>> -      t_APSInt, t_APFloat,        // Value in APSIntVal/APFloatVal.
>> -      t_Null, t_Undef, t_Zero,    // No value.
>> -      t_EmptyArray,               // No value:  []
>> -      t_Constant,                 // Value in ConstantVal.
>> -      t_InlineAsm,                // Value in FTy/StrVal/StrVal2/UIntVal.
>> -      t_ConstantStruct,           // Value in ConstantStructElts.
>> -      t_PackedConstantStruct      // Value in ConstantStructElts.
>> +      t_LocalID, t_GlobalID,           // ID in UIntVal.
>> +      t_LocalName, t_GlobalName,       // Name in StrVal.
>> +      t_APSInt, t_APFloat,             // Value in APSIntVal/APFloatVal.
>> +      t_Null, t_Undef, t_Zero, t_None, // No value.
>> +      t_EmptyArray,                    // No value:  []
>> +      t_Constant,                      // Value in ConstantVal.
>> +      t_InlineAsm,                     // Value in
>> FTy/StrVal/StrVal2/UIntVal.
>> +      t_ConstantStruct,                // Value in ConstantStructElts.
>> +      t_PackedConstantStruct           // Value in ConstantStructElts.
>>      } Kind = t_LocalID;
>>
>>      LLLexer::LocTy Loc;
>>
>> Modified: llvm/trunk/lib/AsmParser/LLToken.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLToken.h?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLToken.h (original)
>> +++ llvm/trunk/lib/AsmParser/LLToken.h Wed Nov 11 15:57:16 2015
>> @@ -49,7 +49,7 @@ namespace lltok {
>>      kw_external, kw_thread_local,
>>      kw_localdynamic, kw_initialexec, kw_localexec,
>>      kw_zeroinitializer,
>> -    kw_undef, kw_null,
>> +    kw_undef, kw_null, kw_none,
>>      kw_to,
>>      kw_caller,
>>      kw_tail,
>>
>> Modified: llvm/trunk/lib/IR/AsmWriter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/AsmWriter.cpp (original)
>> +++ llvm/trunk/lib/IR/AsmWriter.cpp Wed Nov 11 15:57:16 2015
>> @@ -1328,6 +1328,11 @@ static void WriteConstantInternal(raw_os
>>      return;
>>    }
>>
>> +  if (isa<ConstantTokenNone>(CV)) {
>> +    Out << "none";
>> +    return;
>> +  }
>> +
>>    if (isa<UndefValue>(CV)) {
>>      Out << "undef";
>>      return;
>>
>> Modified: llvm/trunk/lib/IR/Constants.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Constants.cpp?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/Constants.cpp (original)
>> +++ llvm/trunk/lib/IR/Constants.cpp Wed Nov 11 15:57:16 2015
>> @@ -81,8 +81,10 @@ bool Constant::isNullValue() const {
>>    if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
>>      return CFP->isZero() && !CFP->isNegative();
>>
>> -  // constant zero is zero for aggregates and cpnull is null for
>> pointers.
>> -  return isa<ConstantAggregateZero>(this) ||
>> isa<ConstantPointerNull>(this);
>> +  // constant zero is zero for aggregates, cpnull is null for pointers,
>> none for
>> +  // tokens.
>> +  return isa<ConstantAggregateZero>(this) ||
>> isa<ConstantPointerNull>(this) ||
>> +         isa<ConstantTokenNone>(this);
>>  }
>>
>>  bool Constant::isAllOnesValue() const {
>> @@ -204,6 +206,8 @@ Constant *Constant::getNullValue(Type *T
>>    case Type::ArrayTyID:
>>    case Type::VectorTyID:
>>      return ConstantAggregateZero::get(Ty);
>> +  case Type::TokenTyID:
>> +    return ConstantTokenNone::get(Ty->getContext());
>>    default:
>>      // Function, Label, or Opaque type?
>>      llvm_unreachable("Cannot create a null constant of that type!");
>> @@ -1170,6 +1174,17 @@ Constant *ConstantVector::getSplat(unsig
>>    return get(Elts);
>>  }
>>
>> +ConstantTokenNone *ConstantTokenNone::get(LLVMContext &Context) {
>> +  LLVMContextImpl *pImpl = Context.pImpl;
>> +  if (!pImpl->TheNoneToken)
>> +    pImpl->TheNoneToken = new ConstantTokenNone(Context);
>> +  return pImpl->TheNoneToken;
>> +}
>> +
>> +/// Remove the constant from the constant table.
>> +void ConstantTokenNone::destroyConstantImpl() {
>> +  llvm_unreachable("You can't
>> ConstantTokenNone->destroyConstantImpl()!");
>> +}
>>
>>  // Utility function for determining if a ConstantExpr is a CastOp or
>> not. This
>>  // can't be inline because we don't want to #include Instruction.h into
>> @@ -2875,6 +2890,11 @@ Value *ConstantFP::handleOperandChangeIm
>>    llvm_unreachable("Unsupported class for handleOperandChange()!");
>>  }
>>
>> +Value *ConstantTokenNone::handleOperandChangeImpl(Value *From, Value *To,
>> +                                                  Use *U) {
>> +  llvm_unreachable("Unsupported class for handleOperandChange()!");
>> +}
>> +
>>  Value *UndefValue::handleOperandChangeImpl(Value *From, Value *To, Use
>> *U) {
>>    llvm_unreachable("Unsupported class for handleOperandChange()!");
>>  }
>>
>> Modified: llvm/trunk/lib/IR/LLVMContextImpl.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.cpp?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/LLVMContextImpl.cpp (original)
>> +++ llvm/trunk/lib/IR/LLVMContextImpl.cpp Wed Nov 11 15:57:16 2015
>> @@ -21,6 +21,7 @@ using namespace llvm;
>>
>>  LLVMContextImpl::LLVMContextImpl(LLVMContext &C)
>>    : TheTrueVal(nullptr), TheFalseVal(nullptr),
>> +    TheNoneToken(nullptr),
>>      VoidTy(C, Type::VoidTyID),
>>      LabelTy(C, Type::LabelTyID),
>>      HalfTy(C, Type::HalfTyID),
>>
>> Modified: llvm/trunk/lib/IR/LLVMContextImpl.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/LLVMContextImpl.h (original)
>> +++ llvm/trunk/lib/IR/LLVMContextImpl.h Wed Nov 11 15:57:16 2015
>> @@ -924,6 +924,8 @@ public:
>>    ConstantInt *TheTrueVal;
>>    ConstantInt *TheFalseVal;
>>
>> +  ConstantTokenNone *TheNoneToken;
>> +
>>    // Basic type instances.
>>    Type VoidTy, LabelTy, HalfTy, FloatTy, DoubleTy, MetadataTy, TokenTy;
>>    Type X86_FP80Ty, FP128Ty, PPC_FP128Ty, X86_MMXTy;
>>
>> Modified: llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp (original)
>> +++ llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp Wed Nov 11 15:57:16
>> 2015
>> @@ -656,7 +656,9 @@ int FunctionComparator::cmpConstants(con
>>    }
>>
>>    switch (L->getValueID()) {
>> -  case Value::UndefValueVal: return TypesRes;
>> +  case Value::UndefValueVal:
>> +  case Value::ConstantTokenNoneVal:
>> +    return TypesRes;
>>    case Value::ConstantIntVal: {
>>      const APInt &LInt = cast<ConstantInt>(L)->getValue();
>>      const APInt &RInt = cast<ConstantInt>(R)->getValue();
>>
>> Modified: llvm/trunk/test/Assembler/token.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/token.ll?rev=252811&r1=252810&r2=252811&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/Assembler/token.ll (original)
>> +++ llvm/trunk/test/Assembler/token.ll Wed Nov 11 15:57:16 2015
>> @@ -4,3 +4,8 @@
>>
>>  ; CHECK: declare void @llvm.token.foobar(token)
>>  declare void @llvm.token.foobar(token)
>> +
>> +define void @f() {
>> +  call void @llvm.token.foobar(token none)
>> +  ret void
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151113/27f72fcc/attachment.html>


More information about the llvm-commits mailing list