From c81174515659e15f2907ec8ced09c6f775738dfa Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Wed, 14 Nov 2001 17:24:49 +0000 Subject: [PATCH] Don't need to load a NULL pointer constant from memory! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1305 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp | 12 ++++++++++-- .../SparcV9/InstrSelection/InstrSelectionSupport.cpp | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp index cb3f9a15822..7fe3e60f7fc 100644 --- a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp +++ b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp @@ -241,14 +241,22 @@ ChooseRegOrImmed(Value* val, return MachineOperand::MO_SignExtendedImmed; } - if (!CPV->getType()->isIntegral()) return opType; - + // Otherwise it needs to be an integer or a NULL pointer + if (! CPV->getType()->isIntegral() && + ! (CPV->getType()->isPointerType() && + CPV->isNullValue())) + return opType; + // Now get the constant value and check if it fits in the IMMED field. // Take advantage of the fact that the max unsigned value will rarely // fit into any IMMED field and ignore that case (i.e., cast smaller // unsigned constants to signed). // int64_t intValue; + if (CPV->getType()->isPointerType()) + { + intValue = 0; + } if (CPV->getType()->isSigned()) { intValue = ((ConstPoolSInt*)CPV)->getValue(); diff --git a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp b/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp index cb3f9a15822..7fe3e60f7fc 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp +++ b/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp @@ -241,14 +241,22 @@ ChooseRegOrImmed(Value* val, return MachineOperand::MO_SignExtendedImmed; } - if (!CPV->getType()->isIntegral()) return opType; - + // Otherwise it needs to be an integer or a NULL pointer + if (! CPV->getType()->isIntegral() && + ! (CPV->getType()->isPointerType() && + CPV->isNullValue())) + return opType; + // Now get the constant value and check if it fits in the IMMED field. // Take advantage of the fact that the max unsigned value will rarely // fit into any IMMED field and ignore that case (i.e., cast smaller // unsigned constants to signed). // int64_t intValue; + if (CPV->getType()->isPointerType()) + { + intValue = 0; + } if (CPV->getType()->isSigned()) { intValue = ((ConstPoolSInt*)CPV)->getValue(); -- 2.34.1