[llvm] r252811 - [IR] Add support for empty tokens
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 13 14:06:54 PST 2015
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/bc0667d3/attachment.html>
More information about the llvm-commits
mailing list