Fix a bug in Dead Argument Elimination.
authorShuxin Yang <shuxin.llvm@gmail.com>
Wed, 9 Oct 2013 17:21:44 +0000 (17:21 +0000)
committerShuxin Yang <shuxin.llvm@gmail.com>
Wed, 9 Oct 2013 17:21:44 +0000 (17:21 +0000)
commite0409098aee1270164a7e453e450264f8e62cbfd
tree52c196dae807f50e66b70aca949a5531a71b2d96
parent1a525e8c80305777e3ca0cba0e1903fdbf04aa86
Fix a bug in Dead Argument Elimination.

  If a function seen at compile time is not necessarily the one linked to
the binary being built, it is illegal to change the actual arguments
passing to it.

  e.g.
   --------------------------
   void foo(int lol) {
     // foo() has linkage satisifying isWeakForLinker()
     // "lol" is not used at all.
   }

   void bar(int lo2) {
      // xform to foo(undef) is illegal, as compiler dose not know which
      // instance of foo() will be linked to the the binary being built.
      foo(lol2);
   }
  -----------------------------

  Such functions can be captured by isWeakForLinker(). NOTE that
mayBeOverridden() is insufficient for this purpose as it dosen't include
linkage types like AvailableExternallyLinkage and LinkOnceODRLinkage.
Take link_odr* as an example, it indicates a set of *EQUIVALENT* globals
that can be merged at link-time. However, the semantic of
*EQUIVALENT*-functions includes parameters. Changing parameters breaks
the assumption.

  Thank John McCall for help, especially for the explanation of subtle
difference between linkage types.

  rdar://11546243

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192302 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/IPO/DeadArgumentElimination.cpp
test/Transforms/DeadArgElim/linkage.ll [new file with mode: 0644]