1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00
llvm-mirror/test/Transforms/GlobalOpt
Duncan P. N. Exon Smith 6a8d2b6215 IR: Drop uniquing when an MDNode Value operand is deleted
This is a fix for PR28697.

An MDNode can indirectly refer to a GlobalValue, through a
ConstantAsMetadata.  When the GlobalValue is deleted, the MDNode operand
is reset to `nullptr`.  If the node is uniqued, this can lead to a
hard-to-detect cache invalidation in a Metadata map that's shared across
an LLVMContext.

Consider:

 1. A map from Metadata* to `T` called RemappedMDs.
 2. A node that references a global variable, `!{i1* @GV}`.
 3. Insert `!{i1* @GV} -> SomeT` in the map.
 4. Delete `@GV`, leaving behind `!{null} -> SomeT`.

Looking up the generic and uninteresting `!{null}` gives you `SomeT`,
which is likely related to `@GV`.  Worse, `SomeT`'s lifetime may be tied
to the deleted `@GV`.

This occurs in practice in the shared ValueMap used since r266579 in the
IRMover.  Other code that handles more than one Module (with different
lifetimes) in the same LLVMContext could hit it too.

The fix here is a partial revert of r225223: in the rare case that an
MDNode operand is a ConstantAsMetadata (i.e., wrapping a node from the
Value hierarchy), drop uniquing if it gets replaced with `nullptr`.
This changes step #4 above to leave behind `distinct !{null} -> SomeT`,
which can't be confused with the generic `!{null}`.

In theory, this can cause some churn in the LLVMContext's MDNode
uniquing map when Values are being deleted.  However:

  - The number of GlobalValues referenced from uniqued MDNodes is
    expected to be quite small.  E.g., the debug info metadata schema
    only references GlobalValues from distinct nodes.

  - Other Constants have the lifetime of the LLVMContext, whose teardown
    is careful to drop references before deleting the constants.

As a result, I don't expect a compile time regression from this change.

llvm-svn: 277625
2016-08-03 18:19:43 +00:00
..
2004-10-10-CastStoreOnce.ll
2005-06-15-LocalizeConstExprCrash.ll
2005-09-27-Crash.ll
2006-07-07-InlineAsmCrash.ll
2006-11-01-ShrinkGlobalPhiCrash.ll
2007-04-05-Crash.ll
2007-05-13-Crash.ll Make "@name =" mandatory for globals in .ll files. 2016-05-10 18:22:45 +00:00
2007-06-04-PackedStruct.ll
2007-11-09-GEP-GEP-Crash.ll
2008-01-03-Crash.ll
2008-01-13-OutOfRangeSROA.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
2008-01-29-VolatileGlobal.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
2008-04-26-SROA-Global-Align.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
2008-07-17-addrspace.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
2008-12-16-HeapSRACrash-2.ll
2008-12-16-HeapSRACrash.ll
2009-01-13-phi-user.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
2009-02-15-BitcastAlias.ll [opaque pointer type] Add textual IR support for explicit type parameter for global aliases 2015-09-11 03:22:04 +00:00
2009-02-15-ResolveAlias.ll [opaque pointer type] Add textual IR support for explicit type parameter for global aliases 2015-09-11 03:22:04 +00:00
2009-03-05-dbg.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
2009-03-06-Anonymous.ll Make "@name =" mandatory for globals in .ll files. 2016-05-10 18:22:45 +00:00
2009-03-07-PromotePtrToBool.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
2009-06-01-RecursivePHI.ll
2009-11-16-BrokenPerformHeapAllocSRoA.ll
2009-11-16-MallocSingleStoreToGlobalVar.ll
2010-02-25-MallocPromote.ll
2010-02-26-MallocSROA.ll
2010-10-19-WeakOdr.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
2011-04-09-EmptyGlobalCtors.ll
2012-05-11-blockaddress.ll
alias-resolve.ll Delete dead GlobalAliases. 2015-12-22 19:50:22 +00:00
alias-used-address-space.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
alias-used-section.ll [opaque pointer type] Add textual IR support for explicit type parameter for global aliases 2015-09-11 03:22:04 +00:00
alias-used.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
array-elem-refs.ll
assume.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
atexit.ll
atomic.ll
available_externally_global_ctors.ll Change hasUniqueInitializer() to call isStrongDefinitionForLinker() instead of !isWeakForLinker() 2015-12-09 16:17:07 +00:00
basictest.ll PM: Port GlobalOpt to the new pass manager 2016-04-26 00:28:01 +00:00
blockaddress.ll
cleanup-pointer-root-users.ll
compiler-used.ll
constantexpr-dangle.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
constantfold-initializers.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
crash-2.ll
crash.ll Revert "Change memcpy/memset/memmove to have dest and source alignments." 2015-11-19 05:56:52 +00:00
ctor-list-opt-constexpr.ll
ctor-list-opt-inbounds.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
ctor-list-opt.ll
cxx-dtor.ll
deadfunction.ll
deadglobal-2.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
deadglobal.ll Delete dead GlobalAliases. 2015-12-22 19:50:22 +00:00
externally-initialized-aggregate.ll GlobalOpt should maintain externally_initialized when splitting aggregates 2015-11-09 16:47:16 +00:00
externally-initialized-global-ctr.ll
externally-initialized.ll GlobalOpt does not treat externally_initialized globals correctly 2015-10-12 13:20:52 +00:00
fastcc.ll
global-demotion.ll [GlobalOpt] Demote globals to locals more aggressively 2015-11-15 14:21:37 +00:00
globalsra-partial.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
globalsra-unknown-index.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
globalsra.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
GSROA-section.ll Make sure that any new and optimized objects created during GlobalOPT copy all the attributes from the base object. 2016-01-22 21:18:20 +00:00
heap-sra-1.ll
heap-sra-2.ll
heap-sra-3.ll
heap-sra-4.ll
heap-sra-phi.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
integer-bool.ll
invariant-nodatalayout.ll Invariant start/end intrinsics overloaded for address space 2016-07-22 17:49:40 +00:00
invariant.group.barrier.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
invariant.ll Invariant start/end intrinsics overloaded for address space 2016-07-22 17:49:40 +00:00
invoke.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
iterate.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
load-store-global.ll
localize-constexpr.ll Delete dead GlobalAliases. 2015-12-22 19:50:22 +00:00
malloc-promote-1.ll
malloc-promote-2.ll
malloc-promote-3.ll
MallocSROA-section.ll Make sure that any new and optimized objects created during GlobalOPT copy all the attributes from the base object. 2016-01-22 21:18:20 +00:00
memcpy.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
memset-null.ll Revert "Change memcpy/memset/memmove to have dest and source alignments." 2015-11-19 05:56:52 +00:00
memset.ll Revert "Change memcpy/memset/memmove to have dest and source alignments." 2015-11-19 05:56:52 +00:00
metadata.ll IR: Drop uniquing when an MDNode Value operand is deleted 2016-08-03 18:19:43 +00:00
phi-select.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
pr21191.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
preserve-comdats.ll
SROA-section.ll Make sure that any new and optimized objects created during GlobalOPT copy all the attributes from the base object. 2016-01-22 21:18:20 +00:00
storepointer-compare.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
storepointer.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
tls.ll
trivialstore.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
undef-init.ll GlobalOpt: Convert a bunch of tests from grep to FileCheck 2016-04-25 23:36:50 +00:00
unnamed-addr.ll IR: Introduce local_unnamed_addr attribute. 2016-06-14 21:01:22 +00:00
zeroinitializer-gep-load.ll