Revert my last couple of patches. They appear to have broken bison.
authorEric Christopher <echristo@apple.com>
Fri, 29 Jan 2010 21:16:24 +0000 (21:16 +0000)
committerEric Christopher <echristo@apple.com>
Fri, 29 Jan 2010 21:16:24 +0000 (21:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94841 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineCalls.cpp
lib/Transforms/Scalar/SimplifyLibCalls.cpp
test/Transforms/InstCombine/objsize.ll [deleted file]
test/Transforms/SimplifyLibCalls/strcpy_chk.ll [deleted file]

index f06cd12ffce57faf7fb1ca8533dcc4e97bbdd3cd..47c37c46587d4fd0634154fcf7c5d06c770bbad1 100644 (file)
@@ -633,42 +633,16 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
     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)));
-      }
-    }
-
-    // TODO: Add more Instruction types here.
-    
+    ConstantInt *Const = cast<ConstantInt>(II->getOperand(2));
+    const Type *Ty = CI.getType();
+
+    // 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));
   }
   }
 
index fc23c420cc8fa86ce9c8f6185aae83dc50aab38a..a49da9ce9e5017645a17ba12499de06bf08faf90 100644 (file)
@@ -1203,6 +1203,9 @@ struct MemMoveChkOpt : public LibCallOptimization {
 
 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 @@ struct StrCpyChkOpt : public LibCallOptimization {
     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;
diff --git a/test/Transforms/InstCombine/objsize.ll b/test/Transforms/InstCombine/objsize.ll
deleted file mode 100644 (file)
index 13bb487..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-; RUN: opt < %s -instcombine -S | FileCheck %s
-@a = common global [60 x i8] zeroinitializer, align 1 ; <[60 x i8]*>
-@.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
diff --git a/test/Transforms/SimplifyLibCalls/strcpy_chk.ll b/test/Transforms/SimplifyLibCalls/strcpy_chk.ll
deleted file mode 100644 (file)
index 422cbd9..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-; RUN: opt < %s -simplify-libcalls -S | FileCheck %s
-@a = common global [60 x i8] zeroinitializer, align 1 ; <[60 x i8]*> [#uses=1]
-@.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