[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Jim Laskey
jlaskey at apple.com
Sat Oct 7 16:38:10 PDT 2006
Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.208 -> 1.209
---
Log message:
Combiner alias analysis passes Multisource (release-asserts.)
---
Diffs of the changes: (+71 -88)
DAGCombiner.cpp | 159 +++++++++++++++++++++++++-------------------------------
1 files changed, 71 insertions(+), 88 deletions(-)
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.208 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.209
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.208 Thu Oct 5 17:57:27 2006
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Sat Oct 7 18:37:56 2006
@@ -46,90 +46,13 @@
static Statistic<> NodesCombined ("dagcombiner",
"Number of dag nodes combined");
-
-static cl::opt<bool>
- CombinerAA("combiner-alias-analysis", cl::Hidden,
- cl::desc("Turn on alias analysis turning testing"));
-
+ static cl::opt<bool>
+ CombinerAA("combiner-alias-analysis", cl::Hidden,
+ cl::desc("Turn on alias analysis turning testing"));
-/// FindBaseOffset - Return true if base is known not to alias with anything
-/// but itself. Provides base object and offset as results.
-bool FindBaseOffset(SDOperand Ptr, SDOperand &Object, int64_t &Offset) {
- // If it's an adding or subtracting a simple constant then add the constant
- // to the offset.
- if (Ptr.getOpcode() == ISD::ADD) {
- if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Ptr.getOperand(1))) {
- bool IsNonAliasing = FindBaseOffset(Ptr.getOperand(0), Object, Offset);
- Offset += C->getValue();
- return IsNonAliasing;
- }
- } else if (Ptr.getOpcode() == ISD::SUB) {
- // FIXME - Aren't all subtract constants converted to add negative constant.
- if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Ptr.getOperand(1))) {
- bool IsNonAliasing = FindBaseOffset(Ptr.getOperand(0), Object, Offset);
- Offset -= C->getValue();
- return IsNonAliasing;
- }
- }
-
- // Primitive operation.
- Object = Ptr; Offset = 0;
-
- // If it's any of the following then it can't alias with anything but itself.
- return isa<FrameIndexSDNode>(Ptr) ||
- isa<ConstantPoolSDNode>(Ptr) ||
- isa<GlobalAddressSDNode>(Ptr);
-}
-
-/// isAlias - Return true if there is any possibility that the two addresses
-/// overlap.
-bool isAlias(SDOperand Ptr1, int64_t Size1, SDOperand SrcValue1,
- SDOperand Ptr2, int64_t Size2, SDOperand SrcValue2) {
- // If they are the same then they must be aliases.
- if (Ptr1 == Ptr2) return true;
-
- // Gather base node and offset information.
- SDOperand Object1, Object2;
- int64_t Offset1, Offset2;
- bool IsNonAliasing1 = FindBaseOffset(Ptr1, Object1, Offset1);
- bool IsNonAliasing2 = FindBaseOffset(Ptr2, Object2, Offset2);
-
- // If they have a same base address then...
- if (Object1 == Object2) {
- // Check to see if the addresses overlap.
- return !((Offset1 + Size1) <= Offset2 || (Offset2 + Size2) <= Offset1);
- }
-
- // Otherwise they alias if they are both non aliasing.
- return !IsNonAliasing1 && IsNonAliasing2;
-}
-
-/// FindAliasInfo - Extracts the relevant alias information from the memory
-/// node. Returns true if the operand was a load.
-bool FindAliasInfo(SDNode *N,
- SDOperand &Ptr, int64_t &Size, SDOperand &SrcValue) {
- switch (N->getOpcode()) {
- case ISD::LOAD:
- Ptr = N->getOperand(1);
- Size = MVT::getSizeInBits(N->getValueType(0)) >> 3;
- SrcValue = N->getOperand(2);
- return true;
- case ISD::STORE:
- Ptr = N->getOperand(2);
- Size = MVT::getSizeInBits(N->getOperand(1).getValueType()) >> 3;
- SrcValue = N->getOperand(3);
- return false;
- default:
- assert(0 && "FindAliasInfo expected a memory operand");
- return false;
- }
-
- return false;
-}
-
//------------------------------ DAGCombiner ---------------------------------//
-class VISIBILITY_HIDDEN DAGCombiner {
+ class VISIBILITY_HIDDEN DAGCombiner {
SelectionDAG &DAG;
TargetLowering &TLI;
bool AfterLegalize;
@@ -603,7 +526,7 @@
// Start out with this token factor.
TFs.push_back(N);
- // Iterate through token factors. The TFs grows a new token factors are
+ // Iterate through token factors. The TFs grows when new token factors are
// encountered.
for (unsigned i = 0; i < TFs.size(); ++i) {
SDNode *TF = TFs[i];
@@ -3316,12 +3239,6 @@
// If this is a select from two identical things, try to pull the operation
// through the select.
if (LHS.getOpcode() == RHS.getOpcode() && LHS.hasOneUse() && RHS.hasOneUse()){
-#if 0
- std::cerr << "SELECT: ["; LHS.Val->dump();
- std::cerr << "] ["; RHS.Val->dump();
- std::cerr << "]\n";
-#endif
-
// If this is a load and the token chain is identical, replace the select
// of two loads with a load through a select of the address to load from.
// This triggers in things like "select bool X, 10.0, 123.0" after the FP
@@ -3978,6 +3895,72 @@
return S;
}
+/// FindBaseOffset - Return true if base is known not to alias with anything
+/// but itself. Provides base object and offset as results.
+static bool FindBaseOffset(SDOperand Ptr, SDOperand &Base, int64_t &Offset) {
+ // Assume it is a primitive operation.
+ Base = Ptr; Offset = 0;
+
+ // If it's an adding a simple constant then integrate the offset.
+ if (Base.getOpcode() == ISD::ADD) {
+ if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Base.getOperand(1))) {
+ Base = Base.getOperand(0);
+ Offset += C->getValue();
+ }
+ }
+
+ // If it's any of the following then it can't alias with anything but itself.
+ return isa<FrameIndexSDNode>(Base) ||
+ isa<ConstantPoolSDNode>(Base) ||
+ isa<GlobalAddressSDNode>(Base);
+}
+
+/// isAlias - Return true if there is any possibility that the two addresses
+/// overlap.
+static bool isAlias(SDOperand Ptr1, int64_t Size1, SDOperand SrcValue1,
+ SDOperand Ptr2, int64_t Size2, SDOperand SrcValue2) {
+ // If they are the same then they must be aliases.
+ if (Ptr1 == Ptr2) return true;
+
+ // Gather base node and offset information.
+ SDOperand Base1, Base2;
+ int64_t Offset1, Offset2;
+ bool KnownBase1 = FindBaseOffset(Ptr1, Base1, Offset1);
+ bool KnownBase2 = FindBaseOffset(Ptr2, Base2, Offset2);
+
+ // If they have a same base address then...
+ if (Base1 == Base2) {
+ // Check to see if the addresses overlap.
+ return!((Offset1 + Size1) <= Offset2 || (Offset2 + Size2) <= Offset1);
+ }
+
+ // Otherwise they alias if either is unknown.
+ return !KnownBase1 || !KnownBase2;
+}
+
+/// FindAliasInfo - Extracts the relevant alias information from the memory
+/// node. Returns true if the operand was a load.
+static bool FindAliasInfo(SDNode *N,
+ SDOperand &Ptr, int64_t &Size, SDOperand &SrcValue) {
+ switch (N->getOpcode()) {
+ case ISD::LOAD:
+ Ptr = N->getOperand(1);
+ Size = MVT::getSizeInBits(N->getValueType(0)) >> 3;
+ SrcValue = N->getOperand(2);
+ return true;
+ case ISD::STORE:
+ Ptr = N->getOperand(2);
+ Size = MVT::getSizeInBits(N->getOperand(1).getValueType()) >> 3;
+ SrcValue = N->getOperand(3);
+ break;
+ default:
+ assert(0 && "FindAliasInfo expected a memory operand");
+ break;
+ }
+
+ return false;
+}
+
/// GatherAllAliases - Walk up chain skipping non-aliasing memory nodes,
/// looking for aliasing nodes and adding them to the Aliases vector.
void DAGCombiner::GatherAllAliases(SDNode *N, SDOperand OriginalChain,
More information about the llvm-commits
mailing list