[llvm-commits] [llvm] r45403 - in /llvm/trunk/lib/Transforms/Scalar: InstructionCombining.cpp SCCP.cpp
Chris Lattner
clattner at apple.com
Wed Jan 2 10:55:03 PST 2008
On Dec 28, 2007, at 11:56 PM, Christopher Lamb wrote:
> URL: http://llvm.org/viewvc/llvm-project?rev=45403&view=rev
> Log:
> Disable null pointer folding transforms for non-generic address
> spaces. This should probably be a target-specific predicate based
> on address space. That way for targets where this isn't applicable
> the predicate can be optimized away.
Hi Christopher,
Is this really needed? There are a variety of places in the compiler
that assume that a null pointer load/store is invalid. For example,
I think we turn "x = load p; c = p == null" into "x = load p; c =
false" for example. Is there any other solution to the problem
you've hit?
-Chris
> Modified:
> llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
> llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/
> Scalar/InstructionCombining.cpp?rev=45403&r1=45402&r2=45403&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Sat
> Dec 29 01:56:53 2007
> @@ -9338,8 +9338,11 @@
> return ReplaceInstUsesWith(LI, LIB);
> }
>
> - if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op))
> - if (isa<ConstantPointerNull>(GEPI->getOperand(0))) {
> + if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {
> + const Value *GEPI0 = GEPI->getOperand(0);
> + // TODO: Consider a target hook for valid address spaces for
> this xform.
> + if (isa<ConstantPointerNull>(GEPI0) &&
> + cast<PointerType>(GEPI0->getType())->getAddressSpace() ==
> 0) {
> // Insert a new store to null instruction before the load to
> indicate
> // that this code is not reachable. We do this instead of
> inserting
> // an unreachable instruction directly because we cannot
> modify the
> @@ -9348,10 +9351,13 @@
> Constant::getNullValue(Op->getType()), &LI);
> return ReplaceInstUsesWith(LI, UndefValue::get(LI.getType()));
> }
> + }
>
> if (Constant *C = dyn_cast<Constant>(Op)) {
> // load null/undef -> undef
> - if ((C->isNullValue() || isa<UndefValue>(C))) {
> + // TODO: Consider a target hook for valid address spaces for
> this xform.
> + if (isa<UndefValue>(C) || (C->isNullValue() &&
> + cast<PointerType>(Op->getType())->getAddressSpace() == 0)) {
> // Insert a new store to null instruction before the load to
> indicate that
> // this code is not reachable. We do this instead of
> inserting an
> // unreachable instruction directly because we cannot modify
> the CFG.
>
> Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/
> Scalar/SCCP.cpp?rev=45403&r1=45402&r2=45403&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Sat Dec 29 01:56:53 2007
> @@ -1015,7 +1015,9 @@
> if (PtrVal.isUndefined()) return; // The pointer is not
> resolved yet!
> if (PtrVal.isConstant() && !I.isVolatile()) {
> Value *Ptr = PtrVal.getConstant();
> - if (isa<ConstantPointerNull>(Ptr)) {
> + // TODO: Consider a target hook for valid address spaces for
> this xform.
> + if (isa<ConstantPointerNull>(Ptr) &&
> + cast<PointerType>(Ptr->getType())->getAddressSpace() == 0) {
> // load null -> null
> markConstant(IV, &I, Constant::getNullValue(I.getType()));
> return;
>
>
> _______________________________________________
> 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