On 24 September 2012 16:41, Jim Grosbach <span dir="ltr"><<a href="mailto:grosbach@apple.com" target="_blank">grosbach@apple.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5"><br>
On Sep 24, 2012, at 3:09 PM, Nick Lewycky <<a href="mailto:nicholas@mxc.ca">nicholas@mxc.ca</a>> wrote:<br>
<br>
> Author: nicholas<br>
> Date: Mon Sep 24 17:09:10 2012<br>
> New Revision: 164561<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=164561&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=164561&view=rev</a><br>
> Log:<br>
> Teach DSE that strcpy, strncpy, strcat and strncat are all stores which may be<br>
> dead.<br>
><br>
> Added:<br>
>    llvm/trunk/test/Transforms/DeadStoreElimination/libcalls.ll<br>
> Modified:<br>
>    llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp<br>
><br></div></div></blockquote><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">> @@ -208,7 +229,8 @@<br>
> /// instruction if any.<br>
> static AliasAnalysis::Location<br>
> getLocForRead(Instruction *Inst, AliasAnalysis &AA) {<br>
> -  assert(hasMemoryWrite(Inst) && "Unknown instruction case");<br>
> +  assert(hasMemoryWrite(Inst, AA.getTargetLibraryInfo()) &&<br>
> +         "Unknown instruction case");<br>
><br>
>   // The only instructions that both read and write are the mem transfer<br>
>   // instructions (memcpy/memmove).<br>
> @@ -225,23 +247,29 @@<br>
>   if (StoreInst *SI = dyn_cast<StoreInst>(I))<br>
>     return SI->isUnordered();<br>
><br>
> -  IntrinsicInst *II = cast<IntrinsicInst>(I);<br>
> -  switch (II->getIntrinsicID()) {<br>
> -  default: llvm_unreachable("doesn't pass 'hasMemoryWrite' predicate");<br>
> -  case Intrinsic::lifetime_end:<br>
> -    // Never remove dead lifetime_end's, e.g. because it is followed by a<br>
> -    // free.<br>
> -    return false;<br>
> -  case Intrinsic::init_trampoline:<br>
> -    // Always safe to remove init_trampoline.<br>
> -    return true;<br>
> +  if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {<br>
> +    switch (II->getIntrinsicID()) {<br>
> +    default: llvm_unreachable("doesn't pass 'hasMemoryWrite' predicate");<br>
> +    case Intrinsic::lifetime_end:<br>
> +      // Never remove dead lifetime_end's, e.g. because it is followed by a<br>
> +      // free.<br>
> +      return false;<br>
> +    case Intrinsic::init_trampoline:<br>
> +      // Always safe to remove init_trampoline.<br>
> +      return true;<br>
><br>
> -  case Intrinsic::memset:<br>
> -  case Intrinsic::memmove:<br>
> -  case Intrinsic::memcpy:<br>
> -    // Don't remove volatile memory intrinsics.<br>
> -    return !cast<MemIntrinsic>(II)->isVolatile();<br>
> +    case Intrinsic::memset:<br>
> +    case Intrinsic::memmove:<br>
> +    case Intrinsic::memcpy:<br>
> +      // Don't remove volatile memory intrinsics.<br>
> +      return !cast<MemIntrinsic>(II)->isVolatile();<br>
> +    }<br>
>   }<br>
> +<br>
> +  if (CallSite CS = I)  // If we assume hasMemoryWrite(I) is true,<br>
> +    return true;        // then there's nothing left to check.<br>
<br>
</div></div>warning: unused<br>
      variable 'CS' [-Wunused-variable]<br>
<div class="im HOEnZb">  if (CallSite CS = I)  // If we assume hasMemoryWrite(I) is true,<br>
</div><div class="HOEnZb"><div class="h5">               ^<br></div></div></blockquote><div><br></div><div>Thanks! Fixed in r164576.</div><div><br></div><div>Nick</div><div><br></div></div><br>