[llvm] r252811 - [IR] Add support for empty tokens
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Sat Nov 14 11:10:10 PST 2015
On Fri, Nov 13, 2015 at 11:11 PM, David Majnemer via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> 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;
>
(the usual suggestion: unique_ptr instead?)
>
> 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
>>>
>>
>>
>
> _______________________________________________
> 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/20151114/48431562/attachment.html>
More information about the llvm-commits
mailing list