[llvm-commits] [llvm] r94841 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineCalls.cpp lib/Transforms/Scalar/SimplifyLibCalls.cpp test/Transforms/InstCombine/objsize.ll test/Transforms/SimplifyLibCalls/strcpy_chk.ll

Eric Christopher echristo at apple.com
Fri Jan 29 13:16:24 PST 2010


Author: echristo
Date: Fri Jan 29 15:16:24 2010
New Revision: 94841

URL: http://llvm.org/viewvc/llvm-project?rev=94841&view=rev
Log:
Revert my last couple of patches. They appear to have broken bison.

Removed:
    llvm/trunk/test/Transforms/InstCombine/objsize.ll
    llvm/trunk/test/Transforms/SimplifyLibCalls/strcpy_chk.ll
Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
    llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=94841&r1=94840&r2=94841&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Fri Jan 29 15:16:24 2010
@@ -633,42 +633,16 @@
     break;
   }
   case Intrinsic::objectsize: {
-    const Type *ReturnTy = CI.getType();
-    Value *Op1 = II->getOperand(1);
-    
-    // If we're a constant expr then we just return the number of bytes
-    // left in whatever we're indexing.  Since it's constant there's no
-    // need for maximum or minimum bytes.
-    if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Op1)) {
-      // If this isn't a GEP give up.
-      if (CE->getOpcode() != Instruction::GetElementPtr) return 0;
-      
-      const PointerType *ObjTy = 
-        reinterpret_cast<const PointerType*>(CE->getOperand(0)->getType());
-
-      if (const ArrayType *AT = dyn_cast<ArrayType>(ObjTy->getElementType())) {
-        
-        // Deal with multi-dimensional arrays
-        const ArrayType *SAT = AT;
-        while ((AT = dyn_cast<ArrayType>(AT->getElementType())))
-          SAT = AT;
-        
-        size_t numElems = SAT->getNumElements();
-        // We return the remaining bytes, so grab the size of an element
-        // in bytes.
-        size_t sizeofElem = SAT->getElementType()->getPrimitiveSizeInBits() / 8;
-
-        ConstantInt *Const = 
-          cast<ConstantInt>(CE->getOperand(CE->getNumOperands() - 1));
-        size_t indx = Const->getZExtValue();
-        return ReplaceInstUsesWith(CI,
-                      ConstantInt::get(ReturnTy,
-                                       ((numElems - indx) * sizeofElem)));
-      }
-    }
+    ConstantInt *Const = cast<ConstantInt>(II->getOperand(2));
+    const Type *Ty = CI.getType();
 
-    // TODO: Add more Instruction types here.
-    
+    // 0 is maximum number of bytes left, 1 is minimum number of bytes left.
+    // TODO: actually add these values, the current return values are "don't
+    // know".
+    if (Const->getZExtValue() == 0)
+      return ReplaceInstUsesWith(CI, Constant::getAllOnesValue(Ty));
+    else
+      return ReplaceInstUsesWith(CI, ConstantInt::get(Ty, 0));
   }
   }
 

Modified: llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp?rev=94841&r1=94840&r2=94841&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp Fri Jan 29 15:16:24 2010
@@ -1203,6 +1203,9 @@
 
 struct StrCpyChkOpt : public LibCallOptimization {
   virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
+    // These optimizations require TargetData.
+    if (!TD) return 0;
+
     const FunctionType *FT = Callee->getFunctionType();
     if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) ||
         !isa<PointerType>(FT->getParamType(0)) ||
@@ -1214,13 +1217,8 @@
     if (!SizeCI)
       return 0;
     
-    // If a) we don't have any length information, or b) we know this will
-    // fit then just lower to a plain strcpy. Otherwise we'll keep our
-    // strcpy_chk call which may fail at runtime if the size is too long.
-    // TODO: It might be nice to get a maximum length out of the possible
-    // string lengths for varying.
-    if (SizeCI->isAllOnesValue() ||
-        SizeCI->getZExtValue() >= GetStringLength(CI->getOperand(2)))
+    // We don't have any length information, just lower to a plain strcpy.
+    if (SizeCI->isAllOnesValue())
       return EmitStrCpy(CI->getOperand(1), CI->getOperand(2), B);
 
     return 0;

Removed: llvm/trunk/test/Transforms/InstCombine/objsize.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/objsize.ll?rev=94840&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/objsize.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/objsize.ll (removed)
@@ -1,30 +0,0 @@
-; RUN: opt < %s -instcombine -S | FileCheck %s
- at a = common global [60 x i8] zeroinitializer, align 1 ; <[60 x i8]*>
- at .str = private constant [8 x i8] c"abcdefg\00"   ; <[8 x i8]*>
-
-define i32 @foo() nounwind {
-; CHECK: @foo
-; CHECK-NEXT: ret i32 60
-  %1 = call i32 @llvm.objectsize.i32(i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false)
-  ret i32 %1
-}
-
-define i8* @bar() nounwind {
-; CHECK: @bar
-entry:
-  %retval = alloca i8*
-  %0 = call i32 @llvm.objectsize.i32(i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false)
-  %cmp = icmp ne i32 %0, -1
-; CHECK: br i1 true
-  br i1 %cmp, label %cond.true, label %cond.false
-
-cond.true:
-  %1 = load i8** %retval;
-  ret i8* %1;
-
-cond.false:
-  %2 = load i8** %retval;
-  ret i8* %2;
-}
-
-declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly
\ No newline at end of file

Removed: llvm/trunk/test/Transforms/SimplifyLibCalls/strcpy_chk.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyLibCalls/strcpy_chk.ll?rev=94840&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/SimplifyLibCalls/strcpy_chk.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyLibCalls/strcpy_chk.ll (removed)
@@ -1,12 +0,0 @@
-; RUN: opt < %s -simplify-libcalls -S | FileCheck %s
- at a = common global [60 x i8] zeroinitializer, align 1 ; <[60 x i8]*> [#uses=1]
- at .str = private constant [8 x i8] c"abcdefg\00"   ; <[8 x i8]*> [#uses=1]
-
-define i8* @foo() nounwind {
-; CHECK: @foo
-; CHECK-NEXT: call i8* @strcpy
-  %call = call i8* @__strcpy_chk(i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), i32 60) ; <i8*> [#uses=1]
-  ret i8* %call
-}
-
-declare i8* @__strcpy_chk(i8*, i8*, i32) nounwind





More information about the llvm-commits mailing list