From a16bbc9aa77c9e22a67e9b0a8be17321990a7ccc Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Mon, 26 Nov 2007 07:17:19 +0000 Subject: [PATCH] Fix another bug that was causing siod to fail. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44325 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/GVN.cpp | 48 +++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index 11fa336c7bb..e3ce9eb62a4 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -150,6 +150,7 @@ namespace { void erase(Value* v); unsigned size(); void setAliasAnalysis(AliasAnalysis* A) { AA = A; } + uint32_t hash_operand(Value* v); }; } @@ -338,6 +339,15 @@ Expression::ExpressionOpcode } } +uint32_t ValueTable::hash_operand(Value* v) { + if (CallInst* CI = dyn_cast(v)) + if (CI->getCalledFunction() && + !AA->doesNotAccessMemory(CI->getCalledFunction())) + return nextValueNumber++; + + return lookup_or_add(v); +} + Expression ValueTable::create_expression(CallInst* C) { Expression e; @@ -350,7 +360,7 @@ Expression ValueTable::create_expression(CallInst* C) { for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end(); I != E; ++I) - e.varargs.push_back(lookup_or_add(*I)); + e.varargs.push_back(hash_operand(*I)); return e; } @@ -358,8 +368,8 @@ Expression ValueTable::create_expression(CallInst* C) { Expression ValueTable::create_expression(BinaryOperator* BO) { Expression e; - e.firstVN = lookup_or_add(BO->getOperand(0)); - e.secondVN = lookup_or_add(BO->getOperand(1)); + e.firstVN = hash_operand(BO->getOperand(0)); + e.secondVN = hash_operand(BO->getOperand(1)); e.thirdVN = 0; e.function = 0; e.type = BO->getType(); @@ -371,8 +381,8 @@ Expression ValueTable::create_expression(BinaryOperator* BO) { Expression ValueTable::create_expression(CmpInst* C) { Expression e; - e.firstVN = lookup_or_add(C->getOperand(0)); - e.secondVN = lookup_or_add(C->getOperand(1)); + e.firstVN = hash_operand(C->getOperand(0)); + e.secondVN = hash_operand(C->getOperand(1)); e.thirdVN = 0; e.function = 0; e.type = C->getType(); @@ -384,7 +394,7 @@ Expression ValueTable::create_expression(CmpInst* C) { Expression ValueTable::create_expression(CastInst* C) { Expression e; - e.firstVN = lookup_or_add(C->getOperand(0)); + e.firstVN = hash_operand(C->getOperand(0)); e.secondVN = 0; e.thirdVN = 0; e.function = 0; @@ -397,9 +407,9 @@ Expression ValueTable::create_expression(CastInst* C) { Expression ValueTable::create_expression(ShuffleVectorInst* S) { Expression e; - e.firstVN = lookup_or_add(S->getOperand(0)); - e.secondVN = lookup_or_add(S->getOperand(1)); - e.thirdVN = lookup_or_add(S->getOperand(2)); + e.firstVN = hash_operand(S->getOperand(0)); + e.secondVN = hash_operand(S->getOperand(1)); + e.thirdVN = hash_operand(S->getOperand(2)); e.function = 0; e.type = S->getType(); e.opcode = Expression::SHUFFLE; @@ -410,8 +420,8 @@ Expression ValueTable::create_expression(ShuffleVectorInst* S) { Expression ValueTable::create_expression(ExtractElementInst* E) { Expression e; - e.firstVN = lookup_or_add(E->getOperand(0)); - e.secondVN = lookup_or_add(E->getOperand(1)); + e.firstVN = hash_operand(E->getOperand(0)); + e.secondVN = hash_operand(E->getOperand(1)); e.thirdVN = 0; e.function = 0; e.type = E->getType(); @@ -423,9 +433,9 @@ Expression ValueTable::create_expression(ExtractElementInst* E) { Expression ValueTable::create_expression(InsertElementInst* I) { Expression e; - e.firstVN = lookup_or_add(I->getOperand(0)); - e.secondVN = lookup_or_add(I->getOperand(1)); - e.thirdVN = lookup_or_add(I->getOperand(2)); + e.firstVN = hash_operand(I->getOperand(0)); + e.secondVN = hash_operand(I->getOperand(1)); + e.thirdVN = hash_operand(I->getOperand(2)); e.function = 0; e.type = I->getType(); e.opcode = Expression::INSERT; @@ -436,9 +446,9 @@ Expression ValueTable::create_expression(InsertElementInst* I) { Expression ValueTable::create_expression(SelectInst* I) { Expression e; - e.firstVN = lookup_or_add(I->getCondition()); - e.secondVN = lookup_or_add(I->getTrueValue()); - e.thirdVN = lookup_or_add(I->getFalseValue()); + e.firstVN = hash_operand(I->getCondition()); + e.secondVN = hash_operand(I->getTrueValue()); + e.thirdVN = hash_operand(I->getFalseValue()); e.function = 0; e.type = I->getType(); e.opcode = Expression::SELECT; @@ -449,7 +459,7 @@ Expression ValueTable::create_expression(SelectInst* I) { Expression ValueTable::create_expression(GetElementPtrInst* G) { Expression e; - e.firstVN = lookup_or_add(G->getPointerOperand()); + e.firstVN = hash_operand(G->getPointerOperand()); e.secondVN = 0; e.thirdVN = 0; e.function = 0; @@ -458,7 +468,7 @@ Expression ValueTable::create_expression(GetElementPtrInst* G) { for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end(); I != E; ++I) - e.varargs.push_back(lookup_or_add(*I)); + e.varargs.push_back(hash_operand(*I)); return e; } -- 2.34.1