[llvm-commits] [llvm] r71158 - in /llvm/trunk: lib/Analysis/ConstantFolding.cpp test/Transforms/InstCombine/constant-fold-ptr-casts.ll
Bill Wendling
isanbard at gmail.com
Thu May 7 10:27:10 PDT 2009
Dan,
This appears to have broken a full bootstrap. Could you investigate
please? See here for details:
http://blamebot.apple.com:8020/builders/full-llvm-OSX/builds/1486/steps/shell/logs/stdio
-bw
On Thu, May 7, 2009 at 7:25 AM, Dan Gohman <gohman at apple.com> wrote:
> Author: djg
> Date: Thu May 7 09:24:56 2009
> New Revision: 71158
>
> URL: http://llvm.org/viewvc/llvm-project?rev=71158&view=rev
> Log:
> Constant-fold ptrtoint+add+inttoptr to gep when the pointer is an
> array and the add is within range. This helps simplify expressions
> expanded by ScalarEvolutionExpander.
>
> Added:
> llvm/trunk/test/Transforms/InstCombine/constant-fold-ptr-casts.ll
> Modified:
> llvm/trunk/lib/Analysis/ConstantFolding.cpp
>
> Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=71158&r1=71157&r2=71158&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
> +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Thu May 7 09:24:56 2009
> @@ -16,6 +16,7 @@
> #include "llvm/Constants.h"
> #include "llvm/DerivedTypes.h"
> #include "llvm/Function.h"
> +#include "llvm/GlobalVariable.h"
> #include "llvm/Instructions.h"
> #include "llvm/Intrinsics.h"
> #include "llvm/ADT/SmallVector.h"
> @@ -383,12 +384,43 @@
> // the int size is >= the ptr size. This requires knowing the width of a
> // pointer, so it can't be done in ConstantExpr::getCast.
> if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ops[0])) {
> - if (TD && CE->getOpcode() == Instruction::PtrToInt &&
> + if (TD &&
> TD->getPointerSizeInBits() <=
> CE->getType()->getPrimitiveSizeInBits()) {
> - Constant *Input = CE->getOperand(0);
> - Constant *C = FoldBitCast(Input, DestTy, *TD);
> - return C ? C : ConstantExpr::getBitCast(Input, DestTy);
> + if (CE->getOpcode() == Instruction::PtrToInt) {
> + Constant *Input = CE->getOperand(0);
> + Constant *C = FoldBitCast(Input, DestTy, *TD);
> + return C ? C : ConstantExpr::getBitCast(Input, DestTy);
> + }
> + // If there's a constant offset added to the integer value before
> + // it is casted back to a pointer, see if the expression can be
> + // converted into a GEP.
> + if (CE->getOpcode() == Instruction::Add)
> + if (ConstantInt *L = dyn_cast<ConstantInt>(CE->getOperand(0)))
> + if (ConstantExpr *R = dyn_cast<ConstantExpr>(CE->getOperand(1)))
> + if (R->getOpcode() == Instruction::PtrToInt)
> + if (GlobalVariable *GV =
> + dyn_cast<GlobalVariable>(R->getOperand(0))) {
> + const PointerType *GVTy = cast<PointerType>(GV->getType());
> + if (const ArrayType *AT =
> + dyn_cast<ArrayType>(GVTy->getElementType())) {
> + const Type *ElTy = AT->getElementType();
> + uint64_t PaddedSize = TD->getTypePaddedSize(ElTy);
> + APInt PSA(L->getValue().getBitWidth(), PaddedSize);
> + if (ElTy == cast<PointerType>(DestTy)->getElementType() &&
> + L->getValue().urem(PSA) == 0) {
> + APInt ElemIdx = L->getValue().udiv(PSA);
> + if (ElemIdx.ult(APInt(ElemIdx.getBitWidth(),
> + AT->getNumElements()))) {
> + Constant *Index[] = {
> + Constant::getNullValue(CE->getType()),
> + ConstantInt::get(ElemIdx)
> + };
> + return ConstantExpr::getGetElementPtr(GV, &Index[0], 2);
> + }
> + }
> + }
> + }
> }
> }
> return ConstantExpr::getCast(Opcode, Ops[0], DestTy);
>
> Added: llvm/trunk/test/Transforms/InstCombine/constant-fold-ptr-casts.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/constant-fold-ptr-casts.ll?rev=71158&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/constant-fold-ptr-casts.ll (added)
> +++ llvm/trunk/test/Transforms/InstCombine/constant-fold-ptr-casts.ll Thu May 7 09:24:56 2009
> @@ -0,0 +1,18 @@
> +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i32 2143034560}
> +
> +; Instcombine should be able to completely fold this code.
> +
> +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
> +target triple = "i686-apple-darwin8"
> +
> + at bar = constant [3 x i64] [i64 9220983451228067448, i64 9220983451228067449, i64 9220983450959631991], align 8
> +
> +define i32 @foo() nounwind {
> +entry:
> + %tmp87.2 = load i64* inttoptr (i32 add (i32 16, i32 ptrtoint ([3 x i64]* @bar to i32)) to i64*), align 8
> + %t0 = bitcast i64 %tmp87.2 to double
> + %tmp9192.2 = fptrunc double %t0 to float
> + %t1 = bitcast float %tmp9192.2 to i32
> + ret i32 %t1
> +}
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list