mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
Clarify that constant folding of instructions applies when all operands
are constant. There was in fact one exception to this (phi nodes) - so remove that exception (InstructionSimplify handles this so there should be no loss). llvm-svn: 120015
This commit is contained in:
parent
af4cd15f2a
commit
809b3e3634
@ -7,7 +7,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file declares routines for folding instructions into constants.
|
||||
// This file declares routines for folding instructions into constants when all
|
||||
// operands are constants, for example "sub i32 1, 0" -> "1".
|
||||
//
|
||||
// Also, to supplement the basic VMCore ConstantExpr simplifications,
|
||||
// this file declares some additional folding routines that can make use of
|
||||
@ -27,11 +28,11 @@ namespace llvm {
|
||||
class Function;
|
||||
class Type;
|
||||
|
||||
/// ConstantFoldInstruction - Attempt to constant fold the specified
|
||||
/// instruction. If successful, the constant result is returned, if not, null
|
||||
/// is returned. Note that this function can only fail when attempting to fold
|
||||
/// instructions like loads and stores, which have no constant expression form.
|
||||
///
|
||||
/// ConstantFoldInstruction - Try to constant fold the specified instruction.
|
||||
/// If successful, the constant result is returned, if not, null is returned.
|
||||
/// Note that this fails if not all of the operands are constant. Otherwise,
|
||||
/// this function can only fail when attempting to fold instructions like loads
|
||||
/// and stores, which have no constant expression form.
|
||||
Constant *ConstantFoldInstruction(Instruction *I, const TargetData *TD = 0);
|
||||
|
||||
/// ConstantFoldConstantExpression - Attempt to fold the constant expression
|
||||
|
@ -695,22 +695,23 @@ static Constant *SymbolicallyEvaluateGEP(Constant *const *Ops, unsigned NumOps,
|
||||
// Constant Folding public APIs
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
||||
/// ConstantFoldInstruction - Attempt to constant fold the specified
|
||||
/// instruction. If successful, the constant result is returned, if not, null
|
||||
/// is returned. Note that this function can only fail when attempting to fold
|
||||
/// instructions like loads and stores, which have no constant expression form.
|
||||
///
|
||||
/// ConstantFoldInstruction - Try to constant fold the specified instruction.
|
||||
/// If successful, the constant result is returned, if not, null is returned.
|
||||
/// Note that this fails if not all of the operands are constant. Otherwise,
|
||||
/// this function can only fail when attempting to fold instructions like loads
|
||||
/// and stores, which have no constant expression form.
|
||||
Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {
|
||||
// Handle PHI nodes specially here...
|
||||
// Handle PHI nodes quickly here...
|
||||
if (PHINode *PN = dyn_cast<PHINode>(I)) {
|
||||
Constant *CommonValue = 0;
|
||||
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
||||
Value *Incoming = PN->getIncomingValue(i);
|
||||
// If the incoming value is equal to the phi node itself or is undef then
|
||||
// skip it.
|
||||
if (Incoming == PN || isa<UndefValue>(Incoming))
|
||||
// If the incoming value is undef then skip it. Note that while we could
|
||||
// skip the value if it is equal to the phi node itself we choose not to
|
||||
// because that would break the rule that constant folding only applies if
|
||||
// all operands are constants.
|
||||
if (isa<UndefValue>(Incoming))
|
||||
continue;
|
||||
// If the incoming value is not a constant, or is a different constant to
|
||||
// the one we saw previously, then give up.
|
||||
|
Loading…
Reference in New Issue
Block a user