[LLVMbugs] Rewriting of strcmp bug and patch

Reid Spencer reid at x10sys.com
Sat Jun 18 10:48:24 PDT 2005


Fixed.

Patch here:

http://mail.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20050613/026736.html

Reid.

On Thu, 2005-06-16 at 07:52 -0500, John Mellor-Crummey wrote:
> strcmp of a string with null was being optimized away incorrectly. 
> Rather than testing the first character
> of the string, it was attempting to test the first character of the null.
> 
> In the example we were looking at, it seemed that we also were 
> running into a similar problem with a missing cast (which we 
> previously encountered with a bug rewriting sprintf); we applied the 
> safe (cast if necessary) operation developed by Chris. Use of this 
> static function in a new place required either a forward declaration 
> of the function or moving the definition of the function. We moved 
> the definition. You might prefer the forward declaration.
> 
> In any case, the patch is below.
> 
> John Mellor-Crummey
> 
> 
> cvs diff -C3 SimplifyLibCalls.cpp
> cvs diff: warning: failed to open /home/johnmc/.cvspass for reading: 
> No such file or directory
> Index: SimplifyLibCalls.cpp
> ===================================================================
> RCS file: /var/cvs/llvm/llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp,v
> retrieving revision 1.42
> diff -C3 -r1.42 SimplifyLibCalls.cpp
> *** SimplifyLibCalls.cpp        21 May 2005 01:27:04 -0000      1.42
> --- SimplifyLibCalls.cpp        16 Jun 2005 12:42:06 -0000
> ***************
> *** 619,624 ****
> --- 619,636 ----
>      }
>    } StrChrOptimizer;
> 
> +
> + /// CastToCStr - Return V if it is an sbyte*, otherwise cast it to sbyte*,
> + /// inserting the cast before IP, and return the cast.
> + /// @brief Cast a value to a "C" string.
> + static Value *CastToCStr(Value *V, Instruction &IP) {
> +   const Type *SBPTy = PointerType::get(Type::SByteTy);
> +   if (V->getType() != SBPTy)
> +     return new CastInst(V, SBPTy, V->getName(), &IP);
> +   return V;
> + }
> +
> +
>    /// This LibCallOptimization will simplify a call to the strcmp library
>    /// function.  It optimizes out cases where one or both arguments 
> are constant
>    /// and the result can be determined statically.
> ***************
> *** 663,669 ****
>          if (len_1 == 0)
>          {
>            // strcmp("",x) -> *x
> !         LoadInst* load = new LoadInst(s1,ci->getName()+".load",ci);
>            CastInst* cast =
>              new CastInst(load,Type::IntTy,ci->getName()+".int",ci);
>            ci->replaceAllUsesWith(cast);
> --- 675,681 ----
>          if (len_1 == 0)
>          {
>            // strcmp("",x) -> *x
> !         LoadInst* load = new 
> LoadInst(CastToCStr(s2,*ci),ci->getName()+".load",ci);
>            CastInst* cast =
>              new CastInst(load,Type::IntTy,ci->getName()+".int",ci);
>            ci->replaceAllUsesWith(cast);
> ***************
> *** 681,687 ****
>          if (len_2 == 0)
>          {
>            // strcmp(x,"") -> *x
> !         LoadInst* load = new LoadInst(s2,ci->getName()+".val",ci);
>            CastInst* cast =
>              new CastInst(load,Type::IntTy,ci->getName()+".int",ci);
>            ci->replaceAllUsesWith(cast);
> --- 693,699 ----
>          if (len_2 == 0)
>          {
>            // strcmp(x,"") -> *x
> !         LoadInst* load = new 
> LoadInst(CastToCStr(s1,*ci),ci->getName()+".val",ci);
>            CastInst* cast =
>              new CastInst(load,Type::IntTy,ci->getName()+".int",ci);
>            ci->replaceAllUsesWith(cast);
> ***************
> *** 1242,1256 ****
>      }
>    } PowOptimizer;
> 
> - /// CastToCStr - Return V if it is an sbyte*, otherwise cast it to sbyte*,
> - /// inserting the cast before IP, and return the cast.
> - /// @brief Cast a value to a "C" string.
> - static Value *CastToCStr(Value *V, Instruction &IP) {
> -   const Type *SBPTy = PointerType::get(Type::SByteTy);
> -   if (V->getType() != SBPTy)
> -     return new CastInst(V, SBPTy, V->getName(), &IP);
> -   return V;
> - }
> 
>    /// This LibCallOptimization will simplify calls to the "fprintf" library
>    /// function. It looks for cases where the result of fprintf is not 
> used and the
> --- 1254,1259 ----
> 
> _______________________________________________
> LLVMbugs mailing list
> LLVMbugs at cs.uiuc.edu
> http://mail.cs.uiuc.edu/mailman/listinfo/llvmbugs
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20050618/b4d504a8/attachment.sig>


More information about the llvm-bugs mailing list