diff options
| author | Matthijs Kooijman <matthijs@stdin.nl> | 2008-06-20 15:25:43 +0000 |
|---|---|---|
| committer | Matthijs Kooijman <matthijs@stdin.nl> | 2008-06-20 15:25:43 +0000 |
| commit | 0c50b953c5c346b78dbd20caf93ee6f589ab93f7 (patch) | |
| tree | 4adaebdb7ffcda82b3ba4bddac781a5c337e9b7b /llvm | |
| parent | 9dc59b7666457be8d9366a36b95c6d3464c78303 (diff) | |
| download | bcm5719-llvm-0c50b953c5c346b78dbd20caf93ee6f589ab93f7.tar.gz bcm5719-llvm-0c50b953c5c346b78dbd20caf93ee6f589ab93f7.zip | |
Don't let DeadArgumentElimination attempt to update callers when the return
type wasn't changed.
llvm-svn: 52538
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp index 3253c54a681..d7febc50c8a 100644 --- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -743,11 +743,18 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) { Args.clear(); if (!Call->use_empty()) { - if (New->getType() == Type::VoidTy) - // Our return value was unused, replace by null for now, uses will get - // removed later on + if (New->getType() == Call->getType()) { + // Return type not changed? Just replace users then + Call->replaceAllUsesWith(New); + New->takeName(Call); + } else if (New->getType() == Type::VoidTy) { + // Our return value has uses, but they will get removed later on. + // Replace by null for now. Call->replaceAllUsesWith(Constant::getNullValue(Call->getType())); - else if (isa<StructType>(RetTy)) { + } else { + assert(isa<StructType>(RetTy) && "Return type changed, but not into a" + "void. The old return type must have" + "been a struct!"); // The original return value was a struct, update all uses (which are // all extractvalue instructions). for (Value::use_iterator I = Call->use_begin(), E = Call->use_end(); @@ -781,11 +788,7 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) { } } New->takeName(Call); - } else { - // The original function had a single return value - Call->replaceAllUsesWith(New); - New->takeName(Call); - } + } } // Finally, remove the old call from the program, reducing the use-count of |

