2009-11-09 22:57:59 +00:00
|
|
|
//===- InstructionSimplify.cpp - Fold instruction operands ----------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file implements routines for folding instructions into simpler forms
|
2010-11-23 10:50:08 +00:00
|
|
|
// that do not require creating new instructions. This does constant folding
|
|
|
|
// ("add i32 1, 1" -> "2") but can also handle non-constant operands, either
|
|
|
|
// returning a constant ("and i32 %x, 0" -> "0") or an already existing value
|
2010-12-20 14:47:04 +00:00
|
|
|
// ("and i32 %x, %x" -> "%x"). All operands are assumed to have already been
|
|
|
|
// simplified: This is usually true and assuming it simplifies the logic (if
|
|
|
|
// they have not been simplified then results are correct but maybe suboptimal).
|
2009-11-09 22:57:59 +00:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2010-12-22 09:40:51 +00:00
|
|
|
#define DEBUG_TYPE "instsimplify"
|
2009-11-09 22:57:59 +00:00
|
|
|
#include "llvm/Analysis/InstructionSimplify.h"
|
2012-12-03 16:50:05 +00:00
|
|
|
#include "llvm/ADT/SetVector.h"
|
|
|
|
#include "llvm/ADT/Statistic.h"
|
2012-02-26 02:09:49 +00:00
|
|
|
#include "llvm/Analysis/AliasAnalysis.h"
|
2009-11-09 22:57:59 +00:00
|
|
|
#include "llvm/Analysis/ConstantFolding.h"
|
2010-11-16 12:16:38 +00:00
|
|
|
#include "llvm/Analysis/Dominators.h"
|
2011-01-25 09:38:29 +00:00
|
|
|
#include "llvm/Analysis/ValueTracking.h"
|
2013-01-02 11:36:10 +00:00
|
|
|
#include "llvm/IR/DataLayout.h"
|
|
|
|
#include "llvm/IR/GlobalAlias.h"
|
|
|
|
#include "llvm/IR/Operator.h"
|
2011-03-04 07:00:57 +00:00
|
|
|
#include "llvm/Support/ConstantRange.h"
|
2012-03-12 11:19:31 +00:00
|
|
|
#include "llvm/Support/GetElementPtrTypeIterator.h"
|
2009-11-10 00:55:12 +00:00
|
|
|
#include "llvm/Support/PatternMatch.h"
|
2010-11-16 12:16:38 +00:00
|
|
|
#include "llvm/Support/ValueHandle.h"
|
2009-11-09 22:57:59 +00:00
|
|
|
using namespace llvm;
|
2009-11-10 00:55:12 +00:00
|
|
|
using namespace llvm::PatternMatch;
|
2009-11-09 22:57:59 +00:00
|
|
|
|
2011-02-09 17:15:04 +00:00
|
|
|
enum { RecursionLimit = 3 };
|
2010-11-10 18:23:01 +00:00
|
|
|
|
2010-12-22 09:40:51 +00:00
|
|
|
STATISTIC(NumExpand, "Number of expansions");
|
|
|
|
STATISTIC(NumFactor , "Number of factorizations");
|
|
|
|
STATISTIC(NumReassoc, "Number of reassociations");
|
|
|
|
|
2012-03-13 11:42:19 +00:00
|
|
|
struct Query {
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD;
|
2012-03-13 11:42:19 +00:00
|
|
|
const TargetLibraryInfo *TLI;
|
|
|
|
const DominatorTree *DT;
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Query(const DataLayout *td, const TargetLibraryInfo *tli,
|
2012-05-17 20:27:58 +00:00
|
|
|
const DominatorTree *dt) : TD(td), TLI(tli), DT(dt) {}
|
2012-03-13 11:42:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static Value *SimplifyAndInst(Value *, Value *, const Query &, unsigned);
|
|
|
|
static Value *SimplifyBinOp(unsigned, Value *, Value *, const Query &,
|
2011-12-01 03:08:23 +00:00
|
|
|
unsigned);
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyCmpInst(unsigned, Value *, Value *, const Query &,
|
2011-12-01 03:08:23 +00:00
|
|
|
unsigned);
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyOrInst(Value *, Value *, const Query &, unsigned);
|
|
|
|
static Value *SimplifyXorInst(Value *, Value *, const Query &, unsigned);
|
2012-03-13 14:07:05 +00:00
|
|
|
static Value *SimplifyTruncInst(Value *, Type *, const Query &, unsigned);
|
2010-11-16 12:16:38 +00:00
|
|
|
|
2011-07-26 15:03:53 +00:00
|
|
|
/// getFalse - For a boolean type, or a vector of boolean type, return false, or
|
|
|
|
/// a vector with every element false, as appropriate for the type.
|
|
|
|
static Constant *getFalse(Type *Ty) {
|
2011-12-01 02:39:36 +00:00
|
|
|
assert(Ty->getScalarType()->isIntegerTy(1) &&
|
2011-07-26 15:03:53 +00:00
|
|
|
"Expected i1 type or a vector of i1!");
|
|
|
|
return Constant::getNullValue(Ty);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// getTrue - For a boolean type, or a vector of boolean type, return true, or
|
|
|
|
/// a vector with every element true, as appropriate for the type.
|
|
|
|
static Constant *getTrue(Type *Ty) {
|
2011-12-01 02:39:36 +00:00
|
|
|
assert(Ty->getScalarType()->isIntegerTy(1) &&
|
2011-07-26 15:03:53 +00:00
|
|
|
"Expected i1 type or a vector of i1!");
|
|
|
|
return Constant::getAllOnesValue(Ty);
|
|
|
|
}
|
|
|
|
|
2011-10-30 19:56:36 +00:00
|
|
|
/// isSameCompare - Is V equivalent to the comparison "LHS Pred RHS"?
|
|
|
|
static bool isSameCompare(Value *V, CmpInst::Predicate Pred, Value *LHS,
|
|
|
|
Value *RHS) {
|
|
|
|
CmpInst *Cmp = dyn_cast<CmpInst>(V);
|
|
|
|
if (!Cmp)
|
|
|
|
return false;
|
|
|
|
CmpInst::Predicate CPred = Cmp->getPredicate();
|
|
|
|
Value *CLHS = Cmp->getOperand(0), *CRHS = Cmp->getOperand(1);
|
|
|
|
if (CPred == Pred && CLHS == LHS && CRHS == RHS)
|
|
|
|
return true;
|
|
|
|
return CPred == CmpInst::getSwappedPredicate(Pred) && CLHS == RHS &&
|
|
|
|
CRHS == LHS;
|
|
|
|
}
|
|
|
|
|
2010-11-16 12:16:38 +00:00
|
|
|
/// ValueDominatesPHI - Does the given value dominate the specified phi node?
|
|
|
|
static bool ValueDominatesPHI(Value *V, PHINode *P, const DominatorTree *DT) {
|
|
|
|
Instruction *I = dyn_cast<Instruction>(V);
|
|
|
|
if (!I)
|
|
|
|
// Arguments and constants dominate all instructions.
|
|
|
|
return true;
|
|
|
|
|
2012-03-21 10:58:47 +00:00
|
|
|
// If we are processing instructions (and/or basic blocks) that have not been
|
|
|
|
// fully added to a function, the parent nodes may still be null. Simply
|
|
|
|
// return the conservative answer in these cases.
|
|
|
|
if (!I->getParent() || !P->getParent() || !I->getParent()->getParent())
|
|
|
|
return false;
|
|
|
|
|
2010-11-16 12:16:38 +00:00
|
|
|
// If we have a DominatorTree then do a precise test.
|
2012-03-13 01:06:07 +00:00
|
|
|
if (DT) {
|
|
|
|
if (!DT->isReachableFromEntry(P->getParent()))
|
|
|
|
return true;
|
|
|
|
if (!DT->isReachableFromEntry(I->getParent()))
|
|
|
|
return false;
|
|
|
|
return DT->dominates(I, P);
|
|
|
|
}
|
2010-11-16 12:16:38 +00:00
|
|
|
|
|
|
|
// Otherwise, if the instruction is in the entry block, and is not an invoke,
|
|
|
|
// then it obviously dominates all phi nodes.
|
|
|
|
if (I->getParent() == &I->getParent()->getParent()->getEntryBlock() &&
|
|
|
|
!isa<InvokeInst>(I))
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2010-11-10 18:23:01 +00:00
|
|
|
|
2010-12-21 13:32:22 +00:00
|
|
|
/// ExpandBinOp - Simplify "A op (B op' C)" by distributing op over op', turning
|
|
|
|
/// it into "(A op B) op' (A op C)". Here "op" is given by Opcode and "op'" is
|
|
|
|
/// given by OpcodeToExpand, while "A" corresponds to LHS and "B op' C" to RHS.
|
|
|
|
/// Also performs the transform "(A op' B) op C" -> "(A op C) op' (B op C)".
|
|
|
|
/// Returns the simplified value, or null if no simplification was performed.
|
|
|
|
static Value *ExpandBinOp(unsigned Opcode, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
unsigned OpcToExpand, const Query &Q,
|
2011-12-01 03:08:23 +00:00
|
|
|
unsigned MaxRecurse) {
|
2010-12-28 13:52:52 +00:00
|
|
|
Instruction::BinaryOps OpcodeToExpand = (Instruction::BinaryOps)OpcToExpand;
|
2010-12-21 13:32:22 +00:00
|
|
|
// Recursion is always used, so bail out at once if we already hit the limit.
|
|
|
|
if (!MaxRecurse--)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
// Check whether the expression has the form "(A op' B) op C".
|
|
|
|
if (BinaryOperator *Op0 = dyn_cast<BinaryOperator>(LHS))
|
|
|
|
if (Op0->getOpcode() == OpcodeToExpand) {
|
|
|
|
// It does! Try turning it into "(A op C) op' (B op C)".
|
|
|
|
Value *A = Op0->getOperand(0), *B = Op0->getOperand(1), *C = RHS;
|
|
|
|
// Do "A op C" and "B op C" both simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *L = SimplifyBinOp(Opcode, A, C, Q, MaxRecurse))
|
|
|
|
if (Value *R = SimplifyBinOp(Opcode, B, C, Q, MaxRecurse)) {
|
2010-12-21 13:32:22 +00:00
|
|
|
// They do! Return "L op' R" if it simplifies or is already available.
|
|
|
|
// If "L op' R" equals "A op' B" then "L op' R" is just the LHS.
|
2011-01-01 20:08:02 +00:00
|
|
|
if ((L == A && R == B) || (Instruction::isCommutative(OpcodeToExpand)
|
|
|
|
&& L == B && R == A)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumExpand;
|
2010-12-21 13:32:22 +00:00
|
|
|
return LHS;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 13:32:22 +00:00
|
|
|
// Otherwise return "L op' R" if it simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(OpcodeToExpand, L, R, Q, MaxRecurse)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumExpand;
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 13:32:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check whether the expression has the form "A op (B op' C)".
|
|
|
|
if (BinaryOperator *Op1 = dyn_cast<BinaryOperator>(RHS))
|
|
|
|
if (Op1->getOpcode() == OpcodeToExpand) {
|
|
|
|
// It does! Try turning it into "(A op B) op' (A op C)".
|
|
|
|
Value *A = LHS, *B = Op1->getOperand(0), *C = Op1->getOperand(1);
|
|
|
|
// Do "A op B" and "A op C" both simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *L = SimplifyBinOp(Opcode, A, B, Q, MaxRecurse))
|
|
|
|
if (Value *R = SimplifyBinOp(Opcode, A, C, Q, MaxRecurse)) {
|
2010-12-21 13:32:22 +00:00
|
|
|
// They do! Return "L op' R" if it simplifies or is already available.
|
|
|
|
// If "L op' R" equals "B op' C" then "L op' R" is just the RHS.
|
2011-01-01 20:08:02 +00:00
|
|
|
if ((L == B && R == C) || (Instruction::isCommutative(OpcodeToExpand)
|
|
|
|
&& L == C && R == B)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumExpand;
|
2010-12-21 13:32:22 +00:00
|
|
|
return RHS;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 13:32:22 +00:00
|
|
|
// Otherwise return "L op' R" if it simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(OpcodeToExpand, L, R, Q, MaxRecurse)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumExpand;
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 13:32:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// FactorizeBinOp - Simplify "LHS Opcode RHS" by factorizing out a common term
|
|
|
|
/// using the operation OpCodeToExtract. For example, when Opcode is Add and
|
|
|
|
/// OpCodeToExtract is Mul then this tries to turn "(A*B)+(A*C)" into "A*(B+C)".
|
|
|
|
/// Returns the simplified value, or null if no simplification was performed.
|
|
|
|
static Value *FactorizeBinOp(unsigned Opcode, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
unsigned OpcToExtract, const Query &Q,
|
2011-12-01 03:08:23 +00:00
|
|
|
unsigned MaxRecurse) {
|
2010-12-28 13:52:52 +00:00
|
|
|
Instruction::BinaryOps OpcodeToExtract = (Instruction::BinaryOps)OpcToExtract;
|
2010-12-21 13:32:22 +00:00
|
|
|
// Recursion is always used, so bail out at once if we already hit the limit.
|
|
|
|
if (!MaxRecurse--)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
BinaryOperator *Op0 = dyn_cast<BinaryOperator>(LHS);
|
|
|
|
BinaryOperator *Op1 = dyn_cast<BinaryOperator>(RHS);
|
|
|
|
|
|
|
|
if (!Op0 || Op0->getOpcode() != OpcodeToExtract ||
|
|
|
|
!Op1 || Op1->getOpcode() != OpcodeToExtract)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
// The expression has the form "(A op' B) op (C op' D)".
|
2010-12-21 14:00:22 +00:00
|
|
|
Value *A = Op0->getOperand(0), *B = Op0->getOperand(1);
|
|
|
|
Value *C = Op1->getOperand(0), *D = Op1->getOperand(1);
|
2010-12-21 13:32:22 +00:00
|
|
|
|
|
|
|
// Use left distributivity, i.e. "X op' (Y op Z) = (X op' Y) op (X op' Z)".
|
|
|
|
// Does the instruction have the form "(A op' B) op (A op' D)" or, in the
|
|
|
|
// commutative case, "(A op' B) op (C op' A)"?
|
2011-01-01 20:08:02 +00:00
|
|
|
if (A == C || (Instruction::isCommutative(OpcodeToExtract) && A == D)) {
|
|
|
|
Value *DD = A == C ? D : C;
|
2010-12-21 13:32:22 +00:00
|
|
|
// Form "A op' (B op DD)" if it simplifies completely.
|
|
|
|
// Does "B op DD" simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Opcode, B, DD, Q, MaxRecurse)) {
|
2010-12-21 13:32:22 +00:00
|
|
|
// It does! Return "A op' V" if it simplifies or is already available.
|
2010-12-22 17:15:25 +00:00
|
|
|
// If V equals B then "A op' V" is just the LHS. If V equals DD then
|
|
|
|
// "A op' V" is just the RHS.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (V == B || V == DD) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumFactor;
|
2011-01-01 20:08:02 +00:00
|
|
|
return V == B ? LHS : RHS;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 13:32:22 +00:00
|
|
|
// Otherwise return "A op' V" if it simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(OpcodeToExtract, A, V, Q, MaxRecurse)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumFactor;
|
2010-12-21 13:32:22 +00:00
|
|
|
return W;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 13:32:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Use right distributivity, i.e. "(X op Y) op' Z = (X op' Z) op (Y op' Z)".
|
|
|
|
// Does the instruction have the form "(A op' B) op (C op' B)" or, in the
|
|
|
|
// commutative case, "(A op' B) op (B op' D)"?
|
2011-01-01 20:08:02 +00:00
|
|
|
if (B == D || (Instruction::isCommutative(OpcodeToExtract) && B == C)) {
|
|
|
|
Value *CC = B == D ? C : D;
|
2010-12-21 13:32:22 +00:00
|
|
|
// Form "(A op CC) op' B" if it simplifies completely..
|
|
|
|
// Does "A op CC" simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Opcode, A, CC, Q, MaxRecurse)) {
|
2010-12-21 13:32:22 +00:00
|
|
|
// It does! Return "V op' B" if it simplifies or is already available.
|
2010-12-22 17:15:25 +00:00
|
|
|
// If V equals A then "V op' B" is just the LHS. If V equals CC then
|
|
|
|
// "V op' B" is just the RHS.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (V == A || V == CC) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumFactor;
|
2011-01-01 20:08:02 +00:00
|
|
|
return V == A ? LHS : RHS;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 13:32:22 +00:00
|
|
|
// Otherwise return "V op' B" if it simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(OpcodeToExtract, V, B, Q, MaxRecurse)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumFactor;
|
2010-12-21 13:32:22 +00:00
|
|
|
return W;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 13:32:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// SimplifyAssociativeBinOp - Generic simplifications for associative binary
|
|
|
|
/// operations. Returns the simpler value, or null if none was found.
|
2010-12-28 13:52:52 +00:00
|
|
|
static Value *SimplifyAssociativeBinOp(unsigned Opc, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2010-12-28 13:52:52 +00:00
|
|
|
Instruction::BinaryOps Opcode = (Instruction::BinaryOps)Opc;
|
2010-12-21 08:49:00 +00:00
|
|
|
assert(Instruction::isAssociative(Opcode) && "Not an associative operation!");
|
|
|
|
|
|
|
|
// Recursion is always used, so bail out at once if we already hit the limit.
|
|
|
|
if (!MaxRecurse--)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
BinaryOperator *Op0 = dyn_cast<BinaryOperator>(LHS);
|
|
|
|
BinaryOperator *Op1 = dyn_cast<BinaryOperator>(RHS);
|
|
|
|
|
|
|
|
// Transform: "(A op B) op C" ==> "A op (B op C)" if it simplifies completely.
|
|
|
|
if (Op0 && Op0->getOpcode() == Opcode) {
|
|
|
|
Value *A = Op0->getOperand(0);
|
|
|
|
Value *B = Op0->getOperand(1);
|
|
|
|
Value *C = RHS;
|
|
|
|
|
|
|
|
// Does "B op C" simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Opcode, B, C, Q, MaxRecurse)) {
|
2010-12-21 08:49:00 +00:00
|
|
|
// It does! Return "A op V" if it simplifies or is already available.
|
|
|
|
// If V equals B then "A op V" is just the LHS.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (V == B) return LHS;
|
2010-12-21 08:49:00 +00:00
|
|
|
// Otherwise return "A op V" if it simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Opcode, A, V, Q, MaxRecurse)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumReassoc;
|
2010-12-21 08:49:00 +00:00
|
|
|
return W;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 08:49:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Transform: "A op (B op C)" ==> "(A op B) op C" if it simplifies completely.
|
|
|
|
if (Op1 && Op1->getOpcode() == Opcode) {
|
|
|
|
Value *A = LHS;
|
|
|
|
Value *B = Op1->getOperand(0);
|
|
|
|
Value *C = Op1->getOperand(1);
|
|
|
|
|
|
|
|
// Does "A op B" simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Opcode, A, B, Q, MaxRecurse)) {
|
2010-12-21 08:49:00 +00:00
|
|
|
// It does! Return "V op C" if it simplifies or is already available.
|
|
|
|
// If V equals B then "V op C" is just the RHS.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (V == B) return RHS;
|
2010-12-21 08:49:00 +00:00
|
|
|
// Otherwise return "V op C" if it simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Opcode, V, C, Q, MaxRecurse)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumReassoc;
|
2010-12-21 08:49:00 +00:00
|
|
|
return W;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 08:49:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// The remaining transforms require commutativity as well as associativity.
|
|
|
|
if (!Instruction::isCommutative(Opcode))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
// Transform: "(A op B) op C" ==> "(C op A) op B" if it simplifies completely.
|
|
|
|
if (Op0 && Op0->getOpcode() == Opcode) {
|
|
|
|
Value *A = Op0->getOperand(0);
|
|
|
|
Value *B = Op0->getOperand(1);
|
|
|
|
Value *C = RHS;
|
|
|
|
|
|
|
|
// Does "C op A" simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Opcode, C, A, Q, MaxRecurse)) {
|
2010-12-21 08:49:00 +00:00
|
|
|
// It does! Return "V op B" if it simplifies or is already available.
|
|
|
|
// If V equals A then "V op B" is just the LHS.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (V == A) return LHS;
|
2010-12-21 08:49:00 +00:00
|
|
|
// Otherwise return "V op B" if it simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Opcode, V, B, Q, MaxRecurse)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumReassoc;
|
2010-12-21 08:49:00 +00:00
|
|
|
return W;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 08:49:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Transform: "A op (B op C)" ==> "B op (C op A)" if it simplifies completely.
|
|
|
|
if (Op1 && Op1->getOpcode() == Opcode) {
|
|
|
|
Value *A = LHS;
|
|
|
|
Value *B = Op1->getOperand(0);
|
|
|
|
Value *C = Op1->getOperand(1);
|
|
|
|
|
|
|
|
// Does "C op A" simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Opcode, C, A, Q, MaxRecurse)) {
|
2010-12-21 08:49:00 +00:00
|
|
|
// It does! Return "B op V" if it simplifies or is already available.
|
|
|
|
// If V equals C then "B op V" is just the RHS.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (V == C) return RHS;
|
2010-12-21 08:49:00 +00:00
|
|
|
// Otherwise return "B op V" if it simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Opcode, B, V, Q, MaxRecurse)) {
|
2010-12-22 09:40:51 +00:00
|
|
|
++NumReassoc;
|
2010-12-21 08:49:00 +00:00
|
|
|
return W;
|
2010-12-22 09:40:51 +00:00
|
|
|
}
|
2010-12-21 08:49:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-11-10 13:00:08 +00:00
|
|
|
/// ThreadBinOpOverSelect - In the case of a binary operation with a select
|
|
|
|
/// instruction as an operand, try to simplify the binop by seeing whether
|
|
|
|
/// evaluating it on both branches of the select results in the same value.
|
|
|
|
/// Returns the common value if so, otherwise returns null.
|
|
|
|
static Value *ThreadBinOpOverSelect(unsigned Opcode, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2010-12-21 09:09:15 +00:00
|
|
|
// Recursion is always used, so bail out at once if we already hit the limit.
|
|
|
|
if (!MaxRecurse--)
|
|
|
|
return 0;
|
|
|
|
|
2010-11-10 13:00:08 +00:00
|
|
|
SelectInst *SI;
|
|
|
|
if (isa<SelectInst>(LHS)) {
|
|
|
|
SI = cast<SelectInst>(LHS);
|
|
|
|
} else {
|
|
|
|
assert(isa<SelectInst>(RHS) && "No select instruction operand!");
|
|
|
|
SI = cast<SelectInst>(RHS);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Evaluate the BinOp on the true and false branches of the select.
|
|
|
|
Value *TV;
|
|
|
|
Value *FV;
|
|
|
|
if (SI == LHS) {
|
2012-03-13 11:42:19 +00:00
|
|
|
TV = SimplifyBinOp(Opcode, SI->getTrueValue(), RHS, Q, MaxRecurse);
|
|
|
|
FV = SimplifyBinOp(Opcode, SI->getFalseValue(), RHS, Q, MaxRecurse);
|
2010-11-10 13:00:08 +00:00
|
|
|
} else {
|
2012-03-13 11:42:19 +00:00
|
|
|
TV = SimplifyBinOp(Opcode, LHS, SI->getTrueValue(), Q, MaxRecurse);
|
|
|
|
FV = SimplifyBinOp(Opcode, LHS, SI->getFalseValue(), Q, MaxRecurse);
|
2010-11-10 13:00:08 +00:00
|
|
|
}
|
|
|
|
|
2011-01-01 16:12:09 +00:00
|
|
|
// If they simplified to the same value, then return the common value.
|
2011-01-01 20:08:02 +00:00
|
|
|
// If they both failed to simplify then return null.
|
|
|
|
if (TV == FV)
|
2010-11-10 13:00:08 +00:00
|
|
|
return TV;
|
|
|
|
|
|
|
|
// If one branch simplified to undef, return the other one.
|
|
|
|
if (TV && isa<UndefValue>(TV))
|
|
|
|
return FV;
|
|
|
|
if (FV && isa<UndefValue>(FV))
|
|
|
|
return TV;
|
|
|
|
|
|
|
|
// If applying the operation did not change the true and false select values,
|
|
|
|
// then the result of the binop is the select itself.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (TV == SI->getTrueValue() && FV == SI->getFalseValue())
|
2010-11-10 13:00:08 +00:00
|
|
|
return SI;
|
|
|
|
|
|
|
|
// If one branch simplified and the other did not, and the simplified
|
|
|
|
// value is equal to the unsimplified one, return the simplified value.
|
|
|
|
// For example, select (cond, X, X & Z) & Z -> X & Z.
|
|
|
|
if ((FV && !TV) || (TV && !FV)) {
|
|
|
|
// Check that the simplified value has the form "X op Y" where "op" is the
|
|
|
|
// same as the original operation.
|
|
|
|
Instruction *Simplified = dyn_cast<Instruction>(FV ? FV : TV);
|
|
|
|
if (Simplified && Simplified->getOpcode() == Opcode) {
|
|
|
|
// The value that didn't simplify is "UnsimplifiedLHS op UnsimplifiedRHS".
|
|
|
|
// We already know that "op" is the same as for the simplified value. See
|
|
|
|
// if the operands match too. If so, return the simplified value.
|
|
|
|
Value *UnsimplifiedBranch = FV ? SI->getTrueValue() : SI->getFalseValue();
|
|
|
|
Value *UnsimplifiedLHS = SI == LHS ? UnsimplifiedBranch : LHS;
|
|
|
|
Value *UnsimplifiedRHS = SI == LHS ? RHS : UnsimplifiedBranch;
|
2011-01-01 20:08:02 +00:00
|
|
|
if (Simplified->getOperand(0) == UnsimplifiedLHS &&
|
|
|
|
Simplified->getOperand(1) == UnsimplifiedRHS)
|
2010-11-10 13:00:08 +00:00
|
|
|
return Simplified;
|
|
|
|
if (Simplified->isCommutative() &&
|
2011-01-01 20:08:02 +00:00
|
|
|
Simplified->getOperand(1) == UnsimplifiedLHS &&
|
|
|
|
Simplified->getOperand(0) == UnsimplifiedRHS)
|
2010-11-10 13:00:08 +00:00
|
|
|
return Simplified;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// ThreadCmpOverSelect - In the case of a comparison with a select instruction,
|
|
|
|
/// try to simplify the comparison by seeing whether both branches of the select
|
|
|
|
/// result in the same value. Returns the common value if so, otherwise returns
|
|
|
|
/// null.
|
|
|
|
static Value *ThreadCmpOverSelect(CmpInst::Predicate Pred, Value *LHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
Value *RHS, const Query &Q,
|
2010-11-10 18:23:01 +00:00
|
|
|
unsigned MaxRecurse) {
|
2010-12-21 09:09:15 +00:00
|
|
|
// Recursion is always used, so bail out at once if we already hit the limit.
|
|
|
|
if (!MaxRecurse--)
|
|
|
|
return 0;
|
|
|
|
|
2010-11-10 13:00:08 +00:00
|
|
|
// Make sure the select is on the LHS.
|
|
|
|
if (!isa<SelectInst>(LHS)) {
|
|
|
|
std::swap(LHS, RHS);
|
|
|
|
Pred = CmpInst::getSwappedPredicate(Pred);
|
|
|
|
}
|
|
|
|
assert(isa<SelectInst>(LHS) && "Not comparing with a select instruction!");
|
|
|
|
SelectInst *SI = cast<SelectInst>(LHS);
|
2011-10-30 19:56:36 +00:00
|
|
|
Value *Cond = SI->getCondition();
|
|
|
|
Value *TV = SI->getTrueValue();
|
|
|
|
Value *FV = SI->getFalseValue();
|
2010-11-10 13:00:08 +00:00
|
|
|
|
2011-02-03 09:37:39 +00:00
|
|
|
// Now that we have "cmp select(Cond, TV, FV), RHS", analyse it.
|
2010-11-10 13:00:08 +00:00
|
|
|
// Does "cmp TV, RHS" simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
Value *TCmp = SimplifyCmpInst(Pred, TV, RHS, Q, MaxRecurse);
|
2011-10-30 19:56:36 +00:00
|
|
|
if (TCmp == Cond) {
|
|
|
|
// It not only simplified, it simplified to the select condition. Replace
|
|
|
|
// it with 'true'.
|
|
|
|
TCmp = getTrue(Cond->getType());
|
|
|
|
} else if (!TCmp) {
|
|
|
|
// It didn't simplify. However if "cmp TV, RHS" is equal to the select
|
|
|
|
// condition then we can replace it with 'true'. Otherwise give up.
|
|
|
|
if (!isSameCompare(Cond, Pred, TV, RHS))
|
|
|
|
return 0;
|
|
|
|
TCmp = getTrue(Cond->getType());
|
2011-02-03 09:37:39 +00:00
|
|
|
}
|
|
|
|
|
2011-10-30 19:56:36 +00:00
|
|
|
// Does "cmp FV, RHS" simplify?
|
2012-03-13 11:42:19 +00:00
|
|
|
Value *FCmp = SimplifyCmpInst(Pred, FV, RHS, Q, MaxRecurse);
|
2011-10-30 19:56:36 +00:00
|
|
|
if (FCmp == Cond) {
|
|
|
|
// It not only simplified, it simplified to the select condition. Replace
|
|
|
|
// it with 'false'.
|
|
|
|
FCmp = getFalse(Cond->getType());
|
|
|
|
} else if (!FCmp) {
|
|
|
|
// It didn't simplify. However if "cmp FV, RHS" is equal to the select
|
|
|
|
// condition then we can replace it with 'false'. Otherwise give up.
|
|
|
|
if (!isSameCompare(Cond, Pred, FV, RHS))
|
|
|
|
return 0;
|
|
|
|
FCmp = getFalse(Cond->getType());
|
|
|
|
}
|
|
|
|
|
|
|
|
// If both sides simplified to the same value, then use it as the result of
|
|
|
|
// the original comparison.
|
|
|
|
if (TCmp == FCmp)
|
|
|
|
return TCmp;
|
2012-02-10 14:31:24 +00:00
|
|
|
|
|
|
|
// The remaining cases only make sense if the select condition has the same
|
|
|
|
// type as the result of the comparison, so bail out if this is not so.
|
|
|
|
if (Cond->getType()->isVectorTy() != RHS->getType()->isVectorTy())
|
|
|
|
return 0;
|
2011-10-30 19:56:36 +00:00
|
|
|
// If the false value simplified to false, then the result of the compare
|
|
|
|
// is equal to "Cond && TCmp". This also catches the case when the false
|
|
|
|
// value simplified to false and the true value to true, returning "Cond".
|
|
|
|
if (match(FCmp, m_Zero()))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyAndInst(Cond, TCmp, Q, MaxRecurse))
|
2011-10-30 19:56:36 +00:00
|
|
|
return V;
|
|
|
|
// If the true value simplified to true, then the result of the compare
|
|
|
|
// is equal to "Cond || FCmp".
|
|
|
|
if (match(TCmp, m_One()))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyOrInst(Cond, FCmp, Q, MaxRecurse))
|
2011-10-30 19:56:36 +00:00
|
|
|
return V;
|
|
|
|
// Finally, if the false value simplified to true and the true value to
|
|
|
|
// false, then the result of the compare is equal to "!Cond".
|
|
|
|
if (match(FCmp, m_One()) && match(TCmp, m_Zero()))
|
|
|
|
if (Value *V =
|
|
|
|
SimplifyXorInst(Cond, Constant::getAllOnesValue(Cond->getType()),
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2011-10-30 19:56:36 +00:00
|
|
|
return V;
|
|
|
|
|
2010-11-10 13:00:08 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-11-10 18:23:01 +00:00
|
|
|
/// ThreadBinOpOverPHI - In the case of a binary operation with an operand that
|
|
|
|
/// is a PHI instruction, try to simplify the binop by seeing whether evaluating
|
|
|
|
/// it on the incoming phi values yields the same result for every value. If so
|
|
|
|
/// returns the common value, otherwise returns null.
|
|
|
|
static Value *ThreadBinOpOverPHI(unsigned Opcode, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2010-12-21 09:09:15 +00:00
|
|
|
// Recursion is always used, so bail out at once if we already hit the limit.
|
|
|
|
if (!MaxRecurse--)
|
|
|
|
return 0;
|
|
|
|
|
2010-11-10 18:23:01 +00:00
|
|
|
PHINode *PI;
|
|
|
|
if (isa<PHINode>(LHS)) {
|
|
|
|
PI = cast<PHINode>(LHS);
|
2010-11-16 12:16:38 +00:00
|
|
|
// Bail out if RHS and the phi may be mutually interdependent due to a loop.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (!ValueDominatesPHI(RHS, PI, Q.DT))
|
2010-11-16 12:16:38 +00:00
|
|
|
return 0;
|
2010-11-10 18:23:01 +00:00
|
|
|
} else {
|
|
|
|
assert(isa<PHINode>(RHS) && "No PHI instruction operand!");
|
|
|
|
PI = cast<PHINode>(RHS);
|
2010-11-16 12:16:38 +00:00
|
|
|
// Bail out if LHS and the phi may be mutually interdependent due to a loop.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (!ValueDominatesPHI(LHS, PI, Q.DT))
|
2010-11-16 12:16:38 +00:00
|
|
|
return 0;
|
2010-11-10 18:23:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Evaluate the BinOp on the incoming phi values.
|
|
|
|
Value *CommonValue = 0;
|
|
|
|
for (unsigned i = 0, e = PI->getNumIncomingValues(); i != e; ++i) {
|
2010-11-15 17:52:45 +00:00
|
|
|
Value *Incoming = PI->getIncomingValue(i);
|
2010-11-17 04:30:22 +00:00
|
|
|
// If the incoming value is the phi node itself, it can safely be skipped.
|
2010-11-15 17:52:45 +00:00
|
|
|
if (Incoming == PI) continue;
|
2010-11-10 18:23:01 +00:00
|
|
|
Value *V = PI == LHS ?
|
2012-03-13 11:42:19 +00:00
|
|
|
SimplifyBinOp(Opcode, Incoming, RHS, Q, MaxRecurse) :
|
|
|
|
SimplifyBinOp(Opcode, LHS, Incoming, Q, MaxRecurse);
|
2010-11-10 18:23:01 +00:00
|
|
|
// If the operation failed to simplify, or simplified to a different value
|
|
|
|
// to previously, then give up.
|
|
|
|
if (!V || (CommonValue && V != CommonValue))
|
|
|
|
return 0;
|
|
|
|
CommonValue = V;
|
|
|
|
}
|
|
|
|
|
|
|
|
return CommonValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// ThreadCmpOverPHI - In the case of a comparison with a PHI instruction, try
|
|
|
|
/// try to simplify the comparison by seeing whether comparing with all of the
|
|
|
|
/// incoming phi values yields the same result every time. If so returns the
|
|
|
|
/// common result, otherwise returns null.
|
|
|
|
static Value *ThreadCmpOverPHI(CmpInst::Predicate Pred, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2010-12-21 09:09:15 +00:00
|
|
|
// Recursion is always used, so bail out at once if we already hit the limit.
|
|
|
|
if (!MaxRecurse--)
|
|
|
|
return 0;
|
|
|
|
|
2010-11-10 18:23:01 +00:00
|
|
|
// Make sure the phi is on the LHS.
|
|
|
|
if (!isa<PHINode>(LHS)) {
|
|
|
|
std::swap(LHS, RHS);
|
|
|
|
Pred = CmpInst::getSwappedPredicate(Pred);
|
|
|
|
}
|
|
|
|
assert(isa<PHINode>(LHS) && "Not comparing with a phi instruction!");
|
|
|
|
PHINode *PI = cast<PHINode>(LHS);
|
|
|
|
|
2010-11-16 12:16:38 +00:00
|
|
|
// Bail out if RHS and the phi may be mutually interdependent due to a loop.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (!ValueDominatesPHI(RHS, PI, Q.DT))
|
2010-11-16 12:16:38 +00:00
|
|
|
return 0;
|
|
|
|
|
2010-11-10 18:23:01 +00:00
|
|
|
// Evaluate the BinOp on the incoming phi values.
|
|
|
|
Value *CommonValue = 0;
|
|
|
|
for (unsigned i = 0, e = PI->getNumIncomingValues(); i != e; ++i) {
|
2010-11-15 17:52:45 +00:00
|
|
|
Value *Incoming = PI->getIncomingValue(i);
|
2010-11-17 04:30:22 +00:00
|
|
|
// If the incoming value is the phi node itself, it can safely be skipped.
|
2010-11-15 17:52:45 +00:00
|
|
|
if (Incoming == PI) continue;
|
2012-03-13 11:42:19 +00:00
|
|
|
Value *V = SimplifyCmpInst(Pred, Incoming, RHS, Q, MaxRecurse);
|
2010-11-10 18:23:01 +00:00
|
|
|
// If the operation failed to simplify, or simplified to a different value
|
|
|
|
// to previously, then give up.
|
|
|
|
if (!V || (CommonValue && V != CommonValue))
|
|
|
|
return 0;
|
|
|
|
CommonValue = V;
|
|
|
|
}
|
|
|
|
|
|
|
|
return CommonValue;
|
|
|
|
}
|
|
|
|
|
2009-11-27 17:42:22 +00:00
|
|
|
/// SimplifyAddInst - Given operands for an Add, see if we can
|
2009-11-10 00:55:12 +00:00
|
|
|
/// fold the result. If not, this returns null.
|
2010-12-20 14:47:04 +00:00
|
|
|
static Value *SimplifyAddInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2009-11-27 17:42:22 +00:00
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
2012-03-13 11:42:19 +00:00
|
|
|
return ConstantFoldInstOperands(Instruction::Add, CLHS->getType(), Ops,
|
|
|
|
Q.TD, Q.TLI);
|
2009-11-27 17:42:22 +00:00
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-27 17:42:22 +00:00
|
|
|
// Canonicalize the constant to the RHS.
|
|
|
|
std::swap(Op0, Op1);
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-12-15 14:07:39 +00:00
|
|
|
// X + undef -> undef
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op1, m_Undef()))
|
2010-12-15 14:07:39 +00:00
|
|
|
return Op1;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-12-15 14:07:39 +00:00
|
|
|
// X + 0 -> X
|
|
|
|
if (match(Op1, m_Zero()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// X + (Y - X) -> Y
|
|
|
|
// (Y - X) + X -> Y
|
2010-12-20 14:47:04 +00:00
|
|
|
// Eg: X + -X -> 0
|
2011-01-01 20:08:02 +00:00
|
|
|
Value *Y = 0;
|
|
|
|
if (match(Op1, m_Sub(m_Value(Y), m_Specific(Op0))) ||
|
|
|
|
match(Op0, m_Sub(m_Value(Y), m_Specific(Op1))))
|
2010-12-15 14:07:39 +00:00
|
|
|
return Y;
|
|
|
|
|
|
|
|
// X + ~X -> -1 since ~X = -X-1
|
2011-01-01 20:08:02 +00:00
|
|
|
if (match(Op0, m_Not(m_Specific(Op1))) ||
|
|
|
|
match(Op1, m_Not(m_Specific(Op0))))
|
2010-12-15 14:07:39 +00:00
|
|
|
return Constant::getAllOnesValue(Op0->getType());
|
2010-11-19 09:20:39 +00:00
|
|
|
|
2010-12-21 14:00:22 +00:00
|
|
|
/// i1 add -> xor.
|
2010-12-21 14:48:48 +00:00
|
|
|
if (MaxRecurse && Op0->getType()->isIntegerTy(1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyXorInst(Op0, Op1, Q, MaxRecurse-1))
|
2010-12-21 15:03:43 +00:00
|
|
|
return V;
|
2010-12-21 14:00:22 +00:00
|
|
|
|
2010-12-21 08:49:00 +00:00
|
|
|
// Try some generic simplifications for associative operations.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyAssociativeBinOp(Instruction::Add, Op0, Op1, Q,
|
2010-12-21 08:49:00 +00:00
|
|
|
MaxRecurse))
|
|
|
|
return V;
|
|
|
|
|
2010-12-21 13:32:22 +00:00
|
|
|
// Mul distributes over Add. Try some generic simplifications based on this.
|
|
|
|
if (Value *V = FactorizeBinOp(Instruction::Add, Op0, Op1, Instruction::Mul,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
|
|
|
|
2010-11-19 09:20:39 +00:00
|
|
|
// Threading Add over selects and phi nodes is pointless, so don't bother.
|
|
|
|
// Threading over the select in "A + select(cond, B, C)" means evaluating
|
|
|
|
// "A+B" and "A+C" and seeing if they are equal; but they are equal if and
|
|
|
|
// only if B and C are equal. If B and C are equal then (since we assume
|
|
|
|
// that operands have already been simplified) "select(cond, B, C)" should
|
|
|
|
// have been simplified to the common value of B and C already. Analysing
|
|
|
|
// "A+B" and "A+C" thus gains nothing, but costs compile time. Similarly
|
|
|
|
// for threading over phi nodes.
|
|
|
|
|
2009-11-27 17:42:22 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-12-20 14:47:04 +00:00
|
|
|
Value *llvm::SimplifyAddInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
2011-12-01 03:08:23 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyAddInst(Op0, Op1, isNSW, isNUW, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
2010-12-20 14:47:04 +00:00
|
|
|
}
|
|
|
|
|
2012-03-12 11:19:31 +00:00
|
|
|
/// \brief Compute the base pointer and cumulative constant offsets for V.
|
|
|
|
///
|
|
|
|
/// This strips all constant offsets off of V, leaving it the base pointer, and
|
|
|
|
/// accumulates the total constant offset applied in the returned constant. It
|
|
|
|
/// returns 0 if V is not a pointer, and returns the constant '0' if there are
|
|
|
|
/// no constant offsets applied.
|
2012-10-08 16:38:25 +00:00
|
|
|
static Constant *stripAndComputeConstantOffsets(const DataLayout &TD,
|
2012-03-12 11:19:31 +00:00
|
|
|
Value *&V) {
|
2013-01-31 00:12:20 +00:00
|
|
|
assert(V->getType()->isPointerTy());
|
2012-03-12 11:19:31 +00:00
|
|
|
|
Revert the majority of the next patch in the address space series:
r165941: Resubmit the changes to llvm core to update the functions to
support different pointer sizes on a per address space basis.
Despite this commit log, this change primarily changed stuff outside of
VMCore, and those changes do not carry any tests for correctness (or
even plausibility), and we have consistently found questionable or flat
out incorrect cases in these changes. Most of them are probably correct,
but we need to devise a system that makes it more clear when we have
handled the address space concerns correctly, and ideally each pass that
gets updated would receive an accompanying test case that exercises that
pass specificaly w.r.t. alternate address spaces.
However, from this commit, I have retained the new C API entry points.
Those were an orthogonal change that probably should have been split
apart, but they seem entirely good.
In several places the changes were very obvious cleanups with no actual
multiple address space code added; these I have not reverted when
I spotted them.
In a few other places there were merge conflicts due to a cleaner
solution being implemented later, often not using address spaces at all.
In those cases, I've preserved the new code which isn't address space
dependent.
This is part of my ongoing effort to clean out the partial address space
code which carries high risk and low test coverage, and not likely to be
finished before the 3.2 release looms closer. Duncan and I would both
like to see the above issues addressed before we return to these
changes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167222 91177308-0d34-0410-b5e6-96231b3b80d8
2012-11-01 09:14:31 +00:00
|
|
|
unsigned IntPtrWidth = TD.getPointerSizeInBits();
|
2012-03-13 00:06:15 +00:00
|
|
|
APInt Offset = APInt::getNullValue(IntPtrWidth);
|
2012-03-12 11:19:31 +00:00
|
|
|
|
|
|
|
// Even though we don't look through PHI nodes, we could be called on an
|
|
|
|
// instruction in an unreachable block, which may be on a cycle.
|
|
|
|
SmallPtrSet<Value *, 4> Visited;
|
|
|
|
Visited.insert(V);
|
|
|
|
do {
|
|
|
|
if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
|
2012-12-11 11:05:15 +00:00
|
|
|
if (!GEP->isInBounds() || !GEP->accumulateConstantOffset(TD, Offset))
|
2012-03-12 11:19:31 +00:00
|
|
|
break;
|
|
|
|
V = GEP->getPointerOperand();
|
|
|
|
} else if (Operator::getOpcode(V) == Instruction::BitCast) {
|
|
|
|
V = cast<Operator>(V)->getOperand(0);
|
|
|
|
} else if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) {
|
|
|
|
if (GA->mayBeOverridden())
|
|
|
|
break;
|
|
|
|
V = GA->getAliasee();
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
assert(V->getType()->isPointerTy() && "Unexpected operand type!");
|
|
|
|
} while (Visited.insert(V));
|
|
|
|
|
2012-11-01 08:07:29 +00:00
|
|
|
Type *IntPtrTy = TD.getIntPtrType(V->getContext());
|
2012-03-13 00:06:15 +00:00
|
|
|
return ConstantInt::get(IntPtrTy, Offset);
|
2012-03-12 11:19:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// \brief Compute the constant difference between two pointer values.
|
|
|
|
/// If the difference is not a constant, returns zero.
|
2012-10-08 16:38:25 +00:00
|
|
|
static Constant *computePointerDifference(const DataLayout &TD,
|
2012-03-12 11:19:31 +00:00
|
|
|
Value *LHS, Value *RHS) {
|
|
|
|
Constant *LHSOffset = stripAndComputeConstantOffsets(TD, LHS);
|
|
|
|
Constant *RHSOffset = stripAndComputeConstantOffsets(TD, RHS);
|
|
|
|
|
|
|
|
// If LHS and RHS are not related via constant offsets to the same base
|
|
|
|
// value, there is nothing we can do here.
|
|
|
|
if (LHS != RHS)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
// Otherwise, the difference of LHS - RHS can be computed as:
|
|
|
|
// LHS - RHS
|
|
|
|
// = (LHSOffset + Base) - (RHSOffset + Base)
|
|
|
|
// = LHSOffset - RHSOffset
|
|
|
|
return ConstantExpr::getSub(LHSOffset, RHSOffset);
|
|
|
|
}
|
|
|
|
|
2010-12-15 14:07:39 +00:00
|
|
|
/// SimplifySubInst - Given operands for a Sub, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2010-12-20 14:47:04 +00:00
|
|
|
static Value *SimplifySubInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2010-12-15 14:07:39 +00:00
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0))
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
|
|
|
return ConstantFoldInstOperands(Instruction::Sub, CLHS->getType(),
|
2012-03-13 11:42:19 +00:00
|
|
|
Ops, Q.TD, Q.TLI);
|
2010-12-15 14:07:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// X - undef -> undef
|
|
|
|
// undef - X -> undef
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op0, m_Undef()) || match(Op1, m_Undef()))
|
2010-12-15 14:07:39 +00:00
|
|
|
return UndefValue::get(Op0->getType());
|
|
|
|
|
|
|
|
// X - 0 -> X
|
|
|
|
if (match(Op1, m_Zero()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// X - X -> 0
|
2011-01-01 20:08:02 +00:00
|
|
|
if (Op0 == Op1)
|
2010-12-15 14:07:39 +00:00
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
2011-01-18 09:24:58 +00:00
|
|
|
// (X*2) - X -> X
|
|
|
|
// (X<<1) - X -> X
|
2011-01-18 11:50:19 +00:00
|
|
|
Value *X = 0;
|
2011-01-18 09:24:58 +00:00
|
|
|
if (match(Op0, m_Mul(m_Specific(Op1), m_ConstantInt<2>())) ||
|
|
|
|
match(Op0, m_Shl(m_Specific(Op1), m_One())))
|
|
|
|
return Op1;
|
|
|
|
|
2011-01-18 11:50:19 +00:00
|
|
|
// (X + Y) - Z -> X + (Y - Z) or Y + (X - Z) if everything simplifies.
|
|
|
|
// For example, (X + Y) - Y -> X; (Y + X) - Y -> X
|
|
|
|
Value *Y = 0, *Z = Op1;
|
|
|
|
if (MaxRecurse && match(Op0, m_Add(m_Value(X), m_Value(Y)))) { // (X + Y) - Z
|
|
|
|
// See if "V === Y - Z" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Instruction::Sub, Y, Z, Q, MaxRecurse-1))
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does! Now see if "X + V" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Instruction::Add, X, V, Q, MaxRecurse-1)) {
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does, we successfully reassociated!
|
|
|
|
++NumReassoc;
|
|
|
|
return W;
|
|
|
|
}
|
|
|
|
// See if "V === X - Z" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Instruction::Sub, X, Z, Q, MaxRecurse-1))
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does! Now see if "Y + V" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Instruction::Add, Y, V, Q, MaxRecurse-1)) {
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does, we successfully reassociated!
|
|
|
|
++NumReassoc;
|
|
|
|
return W;
|
|
|
|
}
|
|
|
|
}
|
2010-12-21 14:00:22 +00:00
|
|
|
|
2011-01-18 11:50:19 +00:00
|
|
|
// X - (Y + Z) -> (X - Y) - Z or (X - Z) - Y if everything simplifies.
|
|
|
|
// For example, X - (X + 1) -> -1
|
|
|
|
X = Op0;
|
|
|
|
if (MaxRecurse && match(Op1, m_Add(m_Value(Y), m_Value(Z)))) { // X - (Y + Z)
|
|
|
|
// See if "V === X - Y" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Instruction::Sub, X, Y, Q, MaxRecurse-1))
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does! Now see if "V - Z" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Instruction::Sub, V, Z, Q, MaxRecurse-1)) {
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does, we successfully reassociated!
|
|
|
|
++NumReassoc;
|
|
|
|
return W;
|
|
|
|
}
|
|
|
|
// See if "V === X - Z" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Instruction::Sub, X, Z, Q, MaxRecurse-1))
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does! Now see if "V - Y" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Instruction::Sub, V, Y, Q, MaxRecurse-1)) {
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does, we successfully reassociated!
|
|
|
|
++NumReassoc;
|
|
|
|
return W;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Z - (X - Y) -> (Z - X) + Y if everything simplifies.
|
|
|
|
// For example, X - (X - Y) -> Y.
|
|
|
|
Z = Op0;
|
2011-01-14 15:26:10 +00:00
|
|
|
if (MaxRecurse && match(Op1, m_Sub(m_Value(X), m_Value(Y)))) // Z - (X - Y)
|
|
|
|
// See if "V === Z - X" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyBinOp(Instruction::Sub, Z, X, Q, MaxRecurse-1))
|
2011-01-18 11:50:19 +00:00
|
|
|
// It does! Now see if "V + Y" simplifies.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *W = SimplifyBinOp(Instruction::Add, V, Y, Q, MaxRecurse-1)) {
|
2011-01-14 15:26:10 +00:00
|
|
|
// It does, we successfully reassociated!
|
|
|
|
++NumReassoc;
|
|
|
|
return W;
|
|
|
|
}
|
|
|
|
|
2012-03-13 14:07:05 +00:00
|
|
|
// trunc(X) - trunc(Y) -> trunc(X - Y) if everything simplifies.
|
|
|
|
if (MaxRecurse && match(Op0, m_Trunc(m_Value(X))) &&
|
|
|
|
match(Op1, m_Trunc(m_Value(Y))))
|
|
|
|
if (X->getType() == Y->getType())
|
|
|
|
// See if "V === X - Y" simplifies.
|
|
|
|
if (Value *V = SimplifyBinOp(Instruction::Sub, X, Y, Q, MaxRecurse-1))
|
|
|
|
// It does! Now see if "trunc V" simplifies.
|
|
|
|
if (Value *W = SimplifyTruncInst(V, Op0->getType(), Q, MaxRecurse-1))
|
|
|
|
// It does, return the simplified "trunc V".
|
|
|
|
return W;
|
|
|
|
|
|
|
|
// Variations on GEP(base, I, ...) - GEP(base, i, ...) -> GEP(null, I-i, ...).
|
|
|
|
if (Q.TD && match(Op0, m_PtrToInt(m_Value(X))) &&
|
|
|
|
match(Op1, m_PtrToInt(m_Value(Y))))
|
|
|
|
if (Constant *Result = computePointerDifference(*Q.TD, X, Y))
|
|
|
|
return ConstantExpr::getIntegerCast(Result, Op0->getType(), true);
|
|
|
|
|
2010-12-21 13:32:22 +00:00
|
|
|
// Mul distributes over Sub. Try some generic simplifications based on this.
|
|
|
|
if (Value *V = FactorizeBinOp(Instruction::Sub, Op0, Op1, Instruction::Mul,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
|
|
|
|
2011-01-18 11:50:19 +00:00
|
|
|
// i1 sub -> xor.
|
|
|
|
if (MaxRecurse && Op0->getType()->isIntegerTy(1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyXorInst(Op0, Op1, Q, MaxRecurse-1))
|
2011-01-18 11:50:19 +00:00
|
|
|
return V;
|
|
|
|
|
2010-12-15 14:07:39 +00:00
|
|
|
// Threading Sub over selects and phi nodes is pointless, so don't bother.
|
|
|
|
// Threading over the select in "A - select(cond, B, C)" means evaluating
|
|
|
|
// "A-B" and "A-C" and seeing if they are equal; but they are equal if and
|
|
|
|
// only if B and C are equal. If B and C are equal then (since we assume
|
|
|
|
// that operands have already been simplified) "select(cond, B, C)" should
|
|
|
|
// have been simplified to the common value of B and C already. Analysing
|
|
|
|
// "A-B" and "A-C" thus gains nothing, but costs compile time. Similarly
|
|
|
|
// for threading over phi nodes.
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-12-20 14:47:04 +00:00
|
|
|
Value *llvm::SimplifySubInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
2011-12-01 03:08:23 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifySubInst(Op0, Op1, isNSW, isNUW, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
2010-12-20 14:47:04 +00:00
|
|
|
}
|
|
|
|
|
Added a slew of SimplifyInstruction floating-point optimizations, many of which take advantage of fast-math flags. Test cases included.
fsub X, +0 ==> X
fsub X, -0 ==> X, when we know X is not -0
fsub +/-0.0, (fsub -0.0, X) ==> X
fsub nsz +/-0.0, (fsub +/-0.0, X) ==> X
fsub nnan ninf X, X ==> 0.0
fadd nsz X, 0 ==> X
fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
where nnan and ninf have to occur at least once somewhere in this expression
fmul X, 1.0 ==> X
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169940 91177308-0d34-0410-b5e6-96231b3b80d8
2012-12-12 00:27:46 +00:00
|
|
|
/// Given operands for an FAdd, see if we can fold the result. If not, this
|
|
|
|
/// returns null.
|
|
|
|
static Value *SimplifyFAddInst(Value *Op0, Value *Op1, FastMathFlags FMF,
|
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
|
|
|
return ConstantFoldInstOperands(Instruction::FAdd, CLHS->getType(),
|
|
|
|
Ops, Q.TD, Q.TLI);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Canonicalize the constant to the RHS.
|
|
|
|
std::swap(Op0, Op1);
|
|
|
|
}
|
|
|
|
|
|
|
|
// fadd X, -0 ==> X
|
|
|
|
if (match(Op1, m_NegZero()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// fadd X, 0 ==> X, when we know X is not -0
|
|
|
|
if (match(Op1, m_Zero()) &&
|
|
|
|
(FMF.noSignedZeros() || CannotBeNegativeZero(Op0)))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
|
|
|
|
// where nnan and ninf have to occur at least once somewhere in this
|
|
|
|
// expression
|
|
|
|
Value *SubOp = 0;
|
|
|
|
if (match(Op1, m_FSub(m_AnyZero(), m_Specific(Op0))))
|
|
|
|
SubOp = Op1;
|
|
|
|
else if (match(Op0, m_FSub(m_AnyZero(), m_Specific(Op1))))
|
|
|
|
SubOp = Op0;
|
|
|
|
if (SubOp) {
|
|
|
|
Instruction *FSub = cast<Instruction>(SubOp);
|
|
|
|
if ((FMF.noNaNs() || FSub->hasNoNaNs()) &&
|
|
|
|
(FMF.noInfs() || FSub->hasNoInfs()))
|
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Given operands for an FSub, see if we can fold the result. If not, this
|
|
|
|
/// returns null.
|
|
|
|
static Value *SimplifyFSubInst(Value *Op0, Value *Op1, FastMathFlags FMF,
|
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
|
|
|
return ConstantFoldInstOperands(Instruction::FSub, CLHS->getType(),
|
|
|
|
Ops, Q.TD, Q.TLI);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// fsub X, 0 ==> X
|
|
|
|
if (match(Op1, m_Zero()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// fsub X, -0 ==> X, when we know X is not -0
|
|
|
|
if (match(Op1, m_NegZero()) &&
|
|
|
|
(FMF.noSignedZeros() || CannotBeNegativeZero(Op0)))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// fsub 0, (fsub -0.0, X) ==> X
|
|
|
|
Value *X;
|
|
|
|
if (match(Op0, m_AnyZero())) {
|
|
|
|
if (match(Op1, m_FSub(m_NegZero(), m_Value(X))))
|
|
|
|
return X;
|
|
|
|
if (FMF.noSignedZeros() && match(Op1, m_FSub(m_AnyZero(), m_Value(X))))
|
|
|
|
return X;
|
|
|
|
}
|
|
|
|
|
|
|
|
// fsub nnan ninf x, x ==> 0.0
|
|
|
|
if (FMF.noNaNs() && FMF.noInfs() && Op0 == Op1)
|
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-11-27 00:46:26 +00:00
|
|
|
/// Given the operands for an FMul, see if we can fold the result
|
|
|
|
static Value *SimplifyFMulInst(Value *Op0, Value *Op1,
|
|
|
|
FastMathFlags FMF,
|
|
|
|
const Query &Q,
|
|
|
|
unsigned MaxRecurse) {
|
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
|
|
|
return ConstantFoldInstOperands(Instruction::FMul, CLHS->getType(),
|
|
|
|
Ops, Q.TD, Q.TLI);
|
|
|
|
}
|
|
|
|
|
Added a slew of SimplifyInstruction floating-point optimizations, many of which take advantage of fast-math flags. Test cases included.
fsub X, +0 ==> X
fsub X, -0 ==> X, when we know X is not -0
fsub +/-0.0, (fsub -0.0, X) ==> X
fsub nsz +/-0.0, (fsub +/-0.0, X) ==> X
fsub nnan ninf X, X ==> 0.0
fadd nsz X, 0 ==> X
fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
where nnan and ninf have to occur at least once somewhere in this expression
fmul X, 1.0 ==> X
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169940 91177308-0d34-0410-b5e6-96231b3b80d8
2012-12-12 00:27:46 +00:00
|
|
|
// Canonicalize the constant to the RHS.
|
|
|
|
std::swap(Op0, Op1);
|
2012-11-27 00:46:26 +00:00
|
|
|
}
|
|
|
|
|
Added a slew of SimplifyInstruction floating-point optimizations, many of which take advantage of fast-math flags. Test cases included.
fsub X, +0 ==> X
fsub X, -0 ==> X, when we know X is not -0
fsub +/-0.0, (fsub -0.0, X) ==> X
fsub nsz +/-0.0, (fsub +/-0.0, X) ==> X
fsub nnan ninf X, X ==> 0.0
fadd nsz X, 0 ==> X
fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
where nnan and ninf have to occur at least once somewhere in this expression
fmul X, 1.0 ==> X
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169940 91177308-0d34-0410-b5e6-96231b3b80d8
2012-12-12 00:27:46 +00:00
|
|
|
// fmul X, 1.0 ==> X
|
|
|
|
if (match(Op1, m_FPOne()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// fmul nnan nsz X, 0 ==> 0
|
|
|
|
if (FMF.noNaNs() && FMF.noSignedZeros() && match(Op1, m_AnyZero()))
|
|
|
|
return Op1;
|
|
|
|
|
2012-11-27 00:46:26 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-12-21 14:00:22 +00:00
|
|
|
/// SimplifyMulInst - Given operands for a Mul, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyMulInst(Value *Op0, Value *Op1, const Query &Q,
|
|
|
|
unsigned MaxRecurse) {
|
2010-12-21 14:00:22 +00:00
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
|
|
|
return ConstantFoldInstOperands(Instruction::Mul, CLHS->getType(),
|
2012-03-13 11:42:19 +00:00
|
|
|
Ops, Q.TD, Q.TLI);
|
2010-12-21 14:00:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Canonicalize the constant to the RHS.
|
|
|
|
std::swap(Op0, Op1);
|
|
|
|
}
|
|
|
|
|
|
|
|
// X * undef -> 0
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op1, m_Undef()))
|
2010-12-21 14:00:22 +00:00
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
|
|
|
// X * 0 -> 0
|
|
|
|
if (match(Op1, m_Zero()))
|
|
|
|
return Op1;
|
|
|
|
|
|
|
|
// X * 1 -> X
|
|
|
|
if (match(Op1, m_One()))
|
|
|
|
return Op0;
|
|
|
|
|
2011-01-30 18:03:50 +00:00
|
|
|
// (X / Y) * Y -> X if the division is exact.
|
2012-01-01 17:55:30 +00:00
|
|
|
Value *X = 0;
|
|
|
|
if (match(Op0, m_Exact(m_IDiv(m_Value(X), m_Specific(Op1)))) || // (X / Y) * Y
|
|
|
|
match(Op1, m_Exact(m_IDiv(m_Value(X), m_Specific(Op0))))) // Y * (X / Y)
|
|
|
|
return X;
|
2011-01-30 18:03:50 +00:00
|
|
|
|
2011-01-29 19:55:23 +00:00
|
|
|
// i1 mul -> and.
|
2010-12-21 14:48:48 +00:00
|
|
|
if (MaxRecurse && Op0->getType()->isIntegerTy(1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyAndInst(Op0, Op1, Q, MaxRecurse-1))
|
2010-12-21 15:03:43 +00:00
|
|
|
return V;
|
2010-12-21 14:00:22 +00:00
|
|
|
|
|
|
|
// Try some generic simplifications for associative operations.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyAssociativeBinOp(Instruction::Mul, Op0, Op1, Q,
|
2010-12-21 14:00:22 +00:00
|
|
|
MaxRecurse))
|
|
|
|
return V;
|
|
|
|
|
|
|
|
// Mul distributes over Add. Try some generic simplifications based on this.
|
|
|
|
if (Value *V = ExpandBinOp(Instruction::Mul, Op0, Op1, Instruction::Add,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2010-12-21 14:00:22 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the operation is with the result of a select instruction, check whether
|
|
|
|
// operating on either branch of the select always yields the same value.
|
|
|
|
if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverSelect(Instruction::Mul, Op0, Op1, Q,
|
2010-12-21 14:00:22 +00:00
|
|
|
MaxRecurse))
|
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the operation is with the result of a phi instruction, check whether
|
|
|
|
// operating on all incoming values of the phi always yields the same value.
|
|
|
|
if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverPHI(Instruction::Mul, Op0, Op1, Q,
|
2010-12-21 14:00:22 +00:00
|
|
|
MaxRecurse))
|
|
|
|
return V;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
Added a slew of SimplifyInstruction floating-point optimizations, many of which take advantage of fast-math flags. Test cases included.
fsub X, +0 ==> X
fsub X, -0 ==> X, when we know X is not -0
fsub +/-0.0, (fsub -0.0, X) ==> X
fsub nsz +/-0.0, (fsub +/-0.0, X) ==> X
fsub nnan ninf X, X ==> 0.0
fadd nsz X, 0 ==> X
fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
where nnan and ninf have to occur at least once somewhere in this expression
fmul X, 1.0 ==> X
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169940 91177308-0d34-0410-b5e6-96231b3b80d8
2012-12-12 00:27:46 +00:00
|
|
|
Value *llvm::SimplifyFAddInst(Value *Op0, Value *Op1, FastMathFlags FMF,
|
|
|
|
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
return ::SimplifyFAddInst(Op0, Op1, FMF, Query (TD, TLI, DT), RecursionLimit);
|
|
|
|
}
|
|
|
|
|
|
|
|
Value *llvm::SimplifyFSubInst(Value *Op0, Value *Op1, FastMathFlags FMF,
|
|
|
|
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
return ::SimplifyFSubInst(Op0, Op1, FMF, Query (TD, TLI, DT), RecursionLimit);
|
|
|
|
}
|
|
|
|
|
2012-11-27 00:46:26 +00:00
|
|
|
Value *llvm::SimplifyFMulInst(Value *Op0, Value *Op1,
|
|
|
|
FastMathFlags FMF,
|
|
|
|
const DataLayout *TD,
|
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
return ::SimplifyFMulInst(Op0, Op1, FMF, Query (TD, TLI, DT), RecursionLimit);
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyMulInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2010-12-21 14:00:22 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyMulInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2010-12-21 14:00:22 +00:00
|
|
|
}
|
|
|
|
|
2011-01-28 16:51:11 +00:00
|
|
|
/// SimplifyDiv - Given operands for an SDiv or UDiv, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2011-02-05 18:33:43 +00:00
|
|
|
static Value *SimplifyDiv(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2011-01-28 16:51:11 +00:00
|
|
|
if (Constant *C0 = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *C1 = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { C0, C1 };
|
2012-03-13 11:42:19 +00:00
|
|
|
return ConstantFoldInstOperands(Opcode, C0->getType(), Ops, Q.TD, Q.TLI);
|
2011-01-28 16:51:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-28 18:50:50 +00:00
|
|
|
bool isSigned = Opcode == Instruction::SDiv;
|
|
|
|
|
2011-01-28 16:51:11 +00:00
|
|
|
// X / undef -> undef
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op1, m_Undef()))
|
2011-01-28 16:51:11 +00:00
|
|
|
return Op1;
|
|
|
|
|
|
|
|
// undef / X -> 0
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op0, m_Undef()))
|
2011-01-28 16:51:11 +00:00
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
|
|
|
// 0 / X -> 0, we don't need to preserve faults!
|
|
|
|
if (match(Op0, m_Zero()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// X / 1 -> X
|
|
|
|
if (match(Op1, m_One()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
if (Op0->getType()->isIntegerTy(1))
|
|
|
|
// It can't be division by zero, hence it must be division by one.
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// X / X -> 1
|
|
|
|
if (Op0 == Op1)
|
|
|
|
return ConstantInt::get(Op0->getType(), 1);
|
|
|
|
|
|
|
|
// (X * Y) / Y -> X if the multiplication does not overflow.
|
|
|
|
Value *X = 0, *Y = 0;
|
|
|
|
if (match(Op0, m_Mul(m_Value(X), m_Value(Y))) && (X == Op1 || Y == Op1)) {
|
|
|
|
if (Y != Op1) std::swap(X, Y); // Ensure expression is (X * Y) / Y, Y = Op1
|
2011-10-27 19:16:21 +00:00
|
|
|
OverflowingBinaryOperator *Mul = cast<OverflowingBinaryOperator>(Op0);
|
2011-02-02 20:52:00 +00:00
|
|
|
// If the Mul knows it does not overflow, then we are good to go.
|
|
|
|
if ((isSigned && Mul->hasNoSignedWrap()) ||
|
|
|
|
(!isSigned && Mul->hasNoUnsignedWrap()))
|
|
|
|
return X;
|
2011-01-28 16:51:11 +00:00
|
|
|
// If X has the form X = A / Y then X * Y cannot overflow.
|
|
|
|
if (BinaryOperator *Div = dyn_cast<BinaryOperator>(X))
|
|
|
|
if (Div->getOpcode() == Opcode && Div->getOperand(1) == Y)
|
|
|
|
return X;
|
|
|
|
}
|
|
|
|
|
2011-01-28 18:50:50 +00:00
|
|
|
// (X rem Y) / Y -> 0
|
|
|
|
if ((isSigned && match(Op0, m_SRem(m_Value(), m_Specific(Op1)))) ||
|
|
|
|
(!isSigned && match(Op0, m_URem(m_Value(), m_Specific(Op1)))))
|
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
|
|
|
// If the operation is with the result of a select instruction, check whether
|
|
|
|
// operating on either branch of the select always yields the same value.
|
|
|
|
if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse))
|
2011-01-28 18:50:50 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the operation is with the result of a phi instruction, check whether
|
|
|
|
// operating on all incoming values of the phi always yields the same value.
|
|
|
|
if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse))
|
2011-01-28 18:50:50 +00:00
|
|
|
return V;
|
|
|
|
|
2011-01-28 16:51:11 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// SimplifySDivInst - Given operands for an SDiv, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifySDivInst(Value *Op0, Value *Op1, const Query &Q,
|
|
|
|
unsigned MaxRecurse) {
|
|
|
|
if (Value *V = SimplifyDiv(Instruction::SDiv, Op0, Op1, Q, MaxRecurse))
|
2011-01-28 16:51:11 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifySDivInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2011-01-29 15:26:31 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifySDivInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2011-01-28 16:51:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// SimplifyUDivInst - Given operands for a UDiv, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyUDivInst(Value *Op0, Value *Op1, const Query &Q,
|
|
|
|
unsigned MaxRecurse) {
|
|
|
|
if (Value *V = SimplifyDiv(Instruction::UDiv, Op0, Op1, Q, MaxRecurse))
|
2011-01-28 16:51:11 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyUDivInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2011-01-29 15:26:31 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyUDivInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2011-01-28 16:51:11 +00:00
|
|
|
}
|
|
|
|
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyFDivInst(Value *Op0, Value *Op1, const Query &Q,
|
|
|
|
unsigned) {
|
2011-01-29 15:26:31 +00:00
|
|
|
// undef / X -> undef (the undef could be a snan).
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op0, m_Undef()))
|
2011-01-29 15:26:31 +00:00
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// X / undef -> undef
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op1, m_Undef()))
|
2011-01-29 15:26:31 +00:00
|
|
|
return Op1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyFDivInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2011-01-29 15:26:31 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyFDivInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2011-01-29 15:26:31 +00:00
|
|
|
}
|
|
|
|
|
2011-05-02 16:27:02 +00:00
|
|
|
/// SimplifyRem - Given operands for an SRem or URem, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
|
|
|
static Value *SimplifyRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2011-05-02 16:27:02 +00:00
|
|
|
if (Constant *C0 = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *C1 = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { C0, C1 };
|
2012-03-13 11:42:19 +00:00
|
|
|
return ConstantFoldInstOperands(Opcode, C0->getType(), Ops, Q.TD, Q.TLI);
|
2011-05-02 16:27:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// X % undef -> undef
|
|
|
|
if (match(Op1, m_Undef()))
|
|
|
|
return Op1;
|
|
|
|
|
|
|
|
// undef % X -> 0
|
|
|
|
if (match(Op0, m_Undef()))
|
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
|
|
|
// 0 % X -> 0, we don't need to preserve faults!
|
|
|
|
if (match(Op0, m_Zero()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// X % 0 -> undef, we don't need to preserve faults!
|
|
|
|
if (match(Op1, m_Zero()))
|
|
|
|
return UndefValue::get(Op0->getType());
|
|
|
|
|
|
|
|
// X % 1 -> 0
|
|
|
|
if (match(Op1, m_One()))
|
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
|
|
|
if (Op0->getType()->isIntegerTy(1))
|
|
|
|
// It can't be remainder by zero, hence it must be remainder by one.
|
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
|
|
|
// X % X -> 0
|
|
|
|
if (Op0 == Op1)
|
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
|
|
|
// If the operation is with the result of a select instruction, check whether
|
|
|
|
// operating on either branch of the select always yields the same value.
|
|
|
|
if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse))
|
2011-05-02 16:27:02 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the operation is with the result of a phi instruction, check whether
|
|
|
|
// operating on all incoming values of the phi always yields the same value.
|
|
|
|
if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse))
|
2011-05-02 16:27:02 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// SimplifySRemInst - Given operands for an SRem, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifySRemInst(Value *Op0, Value *Op1, const Query &Q,
|
|
|
|
unsigned MaxRecurse) {
|
|
|
|
if (Value *V = SimplifyRem(Instruction::SRem, Op0, Op1, Q, MaxRecurse))
|
2011-05-02 16:27:02 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifySRemInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2011-05-02 16:27:02 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifySRemInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2011-05-02 16:27:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// SimplifyURemInst - Given operands for a URem, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyURemInst(Value *Op0, Value *Op1, const Query &Q,
|
2011-12-01 03:08:23 +00:00
|
|
|
unsigned MaxRecurse) {
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyRem(Instruction::URem, Op0, Op1, Q, MaxRecurse))
|
2011-05-02 16:27:02 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyURemInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2011-05-02 16:27:02 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyURemInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2011-05-02 16:27:02 +00:00
|
|
|
}
|
|
|
|
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyFRemInst(Value *Op0, Value *Op1, const Query &,
|
2011-12-01 03:08:23 +00:00
|
|
|
unsigned) {
|
2011-05-02 16:27:02 +00:00
|
|
|
// undef % X -> undef (the undef could be a snan).
|
|
|
|
if (match(Op0, m_Undef()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// X % undef -> undef
|
|
|
|
if (match(Op1, m_Undef()))
|
|
|
|
return Op1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyFRemInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2011-05-02 16:27:02 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyFRemInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2011-05-02 16:27:02 +00:00
|
|
|
}
|
|
|
|
|
2011-01-14 14:44:12 +00:00
|
|
|
/// SimplifyShift - Given operands for an Shl, LShr or AShr, see if we can
|
2011-01-14 00:37:45 +00:00
|
|
|
/// fold the result. If not, this returns null.
|
2011-01-14 14:44:12 +00:00
|
|
|
static Value *SimplifyShift(unsigned Opcode, Value *Op0, Value *Op1,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2011-01-14 00:37:45 +00:00
|
|
|
if (Constant *C0 = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *C1 = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { C0, C1 };
|
2012-03-13 11:42:19 +00:00
|
|
|
return ConstantFoldInstOperands(Opcode, C0->getType(), Ops, Q.TD, Q.TLI);
|
2011-01-14 00:37:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-14 14:44:12 +00:00
|
|
|
// 0 shift by X -> 0
|
2011-01-14 00:37:45 +00:00
|
|
|
if (match(Op0, m_Zero()))
|
|
|
|
return Op0;
|
|
|
|
|
2011-01-14 14:44:12 +00:00
|
|
|
// X shift by 0 -> X
|
2011-01-14 00:37:45 +00:00
|
|
|
if (match(Op1, m_Zero()))
|
|
|
|
return Op0;
|
|
|
|
|
2011-01-14 14:44:12 +00:00
|
|
|
// X shift by undef -> undef because it may shift by the bitwidth.
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op1, m_Undef()))
|
2011-01-14 00:37:45 +00:00
|
|
|
return Op1;
|
|
|
|
|
|
|
|
// Shifting by the bitwidth or more is undefined.
|
|
|
|
if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1))
|
|
|
|
if (CI->getValue().getLimitedValue() >=
|
|
|
|
Op0->getType()->getScalarSizeInBits())
|
|
|
|
return UndefValue::get(Op0->getType());
|
|
|
|
|
2011-01-14 14:44:12 +00:00
|
|
|
// If the operation is with the result of a select instruction, check whether
|
|
|
|
// operating on either branch of the select always yields the same value.
|
|
|
|
if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse))
|
2011-01-14 14:44:12 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the operation is with the result of a phi instruction, check whether
|
|
|
|
// operating on all incoming values of the phi always yields the same value.
|
|
|
|
if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse))
|
2011-01-14 14:44:12 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// SimplifyShlInst - Given operands for an Shl, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2011-02-09 17:15:04 +00:00
|
|
|
static Value *SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
|
|
|
if (Value *V = SimplifyShift(Instruction::Shl, Op0, Op1, Q, MaxRecurse))
|
2011-01-14 14:44:12 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// undef << X -> 0
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op0, m_Undef()))
|
2011-01-14 14:44:12 +00:00
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
2011-02-09 17:15:04 +00:00
|
|
|
// (X >> A) << A -> X
|
|
|
|
Value *X;
|
2012-01-01 17:55:30 +00:00
|
|
|
if (match(Op0, m_Exact(m_Shr(m_Value(X), m_Specific(Op1)))))
|
2011-02-09 17:15:04 +00:00
|
|
|
return X;
|
2011-01-14 00:37:45 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-02-09 17:15:04 +00:00
|
|
|
Value *llvm::SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
2011-12-01 03:08:23 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyShlInst(Op0, Op1, isNSW, isNUW, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
2011-01-14 00:37:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// SimplifyLShrInst - Given operands for an LShr, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2011-02-09 17:15:04 +00:00
|
|
|
static Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
|
|
|
if (Value *V = SimplifyShift(Instruction::LShr, Op0, Op1, Q, MaxRecurse))
|
2011-01-14 14:44:12 +00:00
|
|
|
return V;
|
2011-01-14 00:37:45 +00:00
|
|
|
|
|
|
|
// undef >>l X -> 0
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op0, m_Undef()))
|
2011-01-14 00:37:45 +00:00
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
2011-02-09 17:15:04 +00:00
|
|
|
// (X << A) >> A -> X
|
|
|
|
Value *X;
|
|
|
|
if (match(Op0, m_Shl(m_Value(X), m_Specific(Op1))) &&
|
|
|
|
cast<OverflowingBinaryOperator>(Op0)->hasNoUnsignedWrap())
|
|
|
|
return X;
|
2011-02-13 17:15:40 +00:00
|
|
|
|
2011-01-14 00:37:45 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-02-09 17:15:04 +00:00
|
|
|
Value *llvm::SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyLShrInst(Op0, Op1, isExact, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
2011-01-14 00:37:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// SimplifyAShrInst - Given operands for an AShr, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2011-02-09 17:15:04 +00:00
|
|
|
static Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
|
|
|
if (Value *V = SimplifyShift(Instruction::AShr, Op0, Op1, Q, MaxRecurse))
|
2011-01-14 14:44:12 +00:00
|
|
|
return V;
|
2011-01-14 00:37:45 +00:00
|
|
|
|
|
|
|
// all ones >>a X -> all ones
|
|
|
|
if (match(Op0, m_AllOnes()))
|
|
|
|
return Op0;
|
|
|
|
|
|
|
|
// undef >>a X -> all ones
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op0, m_Undef()))
|
2011-01-14 00:37:45 +00:00
|
|
|
return Constant::getAllOnesValue(Op0->getType());
|
|
|
|
|
2011-02-09 17:15:04 +00:00
|
|
|
// (X << A) >> A -> X
|
|
|
|
Value *X;
|
|
|
|
if (match(Op0, m_Shl(m_Value(X), m_Specific(Op1))) &&
|
|
|
|
cast<OverflowingBinaryOperator>(Op0)->hasNoSignedWrap())
|
|
|
|
return X;
|
2011-02-13 17:15:40 +00:00
|
|
|
|
2011-01-14 00:37:45 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-02-09 17:15:04 +00:00
|
|
|
Value *llvm::SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyAShrInst(Op0, Op1, isExact, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
2011-01-14 00:37:45 +00:00
|
|
|
}
|
|
|
|
|
2009-11-27 17:42:22 +00:00
|
|
|
/// SimplifyAndInst - Given operands for an And, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyAndInst(Value *Op0, Value *Op1, const Query &Q,
|
2011-12-01 03:08:23 +00:00
|
|
|
unsigned MaxRecurse) {
|
2009-11-10 00:55:12 +00:00
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
|
|
|
return ConstantFoldInstOperands(Instruction::And, CLHS->getType(),
|
2012-03-13 11:42:19 +00:00
|
|
|
Ops, Q.TD, Q.TLI);
|
2009-11-10 00:55:12 +00:00
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// Canonicalize the constant to the RHS.
|
|
|
|
std::swap(Op0, Op1);
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// X & undef -> 0
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op1, m_Undef()))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Constant::getNullValue(Op0->getType());
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// X & X = X
|
2011-01-01 20:08:02 +00:00
|
|
|
if (Op0 == Op1)
|
2009-11-10 00:55:12 +00:00
|
|
|
return Op0;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-11-17 18:52:15 +00:00
|
|
|
// X & 0 = 0
|
|
|
|
if (match(Op1, m_Zero()))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Op1;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-11-17 18:52:15 +00:00
|
|
|
// X & -1 = X
|
|
|
|
if (match(Op1, m_AllOnes()))
|
|
|
|
return Op0;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// A & ~A = ~A & A = 0
|
2011-02-09 17:15:04 +00:00
|
|
|
if (match(Op0, m_Not(m_Specific(Op1))) ||
|
|
|
|
match(Op1, m_Not(m_Specific(Op0))))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Constant::getNullValue(Op0->getType());
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// (A | ?) & A = A
|
2011-02-09 17:15:04 +00:00
|
|
|
Value *A = 0, *B = 0;
|
2009-11-10 00:55:12 +00:00
|
|
|
if (match(Op0, m_Or(m_Value(A), m_Value(B))) &&
|
2011-01-01 20:08:02 +00:00
|
|
|
(A == Op1 || B == Op1))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Op1;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// A & (A | ?) = A
|
|
|
|
if (match(Op1, m_Or(m_Value(A), m_Value(B))) &&
|
2011-01-01 20:08:02 +00:00
|
|
|
(A == Op0 || B == Op0))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Op0;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2011-10-26 20:55:21 +00:00
|
|
|
// A & (-A) = A if A is a power of two or zero.
|
|
|
|
if (match(Op0, m_Neg(m_Specific(Op1))) ||
|
|
|
|
match(Op1, m_Neg(m_Specific(Op0)))) {
|
2012-12-13 03:37:24 +00:00
|
|
|
if (isKnownToBeAPowerOfTwo(Op0, /*OrZero*/true))
|
2011-10-26 20:55:21 +00:00
|
|
|
return Op0;
|
2012-12-13 03:37:24 +00:00
|
|
|
if (isKnownToBeAPowerOfTwo(Op1, /*OrZero*/true))
|
2011-10-26 20:55:21 +00:00
|
|
|
return Op1;
|
|
|
|
}
|
|
|
|
|
2010-12-21 08:49:00 +00:00
|
|
|
// Try some generic simplifications for associative operations.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyAssociativeBinOp(Instruction::And, Op0, Op1, Q,
|
|
|
|
MaxRecurse))
|
2010-12-21 08:49:00 +00:00
|
|
|
return V;
|
2010-09-10 22:39:55 +00:00
|
|
|
|
2010-12-21 13:32:22 +00:00
|
|
|
// And distributes over Or. Try some generic simplifications based on this.
|
|
|
|
if (Value *V = ExpandBinOp(Instruction::And, Op0, Op1, Instruction::Or,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// And distributes over Xor. Try some generic simplifications based on this.
|
|
|
|
if (Value *V = ExpandBinOp(Instruction::And, Op0, Op1, Instruction::Xor,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// Or distributes over And. Try some generic simplifications based on this.
|
|
|
|
if (Value *V = FactorizeBinOp(Instruction::And, Op0, Op1, Instruction::Or,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
|
|
|
|
2010-11-10 13:00:08 +00:00
|
|
|
// If the operation is with the result of a select instruction, check whether
|
|
|
|
// operating on either branch of the select always yields the same value.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverSelect(Instruction::And, Op0, Op1, Q,
|
|
|
|
MaxRecurse))
|
2010-11-10 18:23:01 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the operation is with the result of a phi instruction, check whether
|
|
|
|
// operating on all incoming values of the phi always yields the same value.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverPHI(Instruction::And, Op0, Op1, Q,
|
2010-12-21 09:09:15 +00:00
|
|
|
MaxRecurse))
|
2010-11-10 13:00:08 +00:00
|
|
|
return V;
|
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2009-11-09 22:57:59 +00:00
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyAndInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2010-11-16 12:16:38 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyAndInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2010-11-10 18:23:01 +00:00
|
|
|
}
|
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
/// SimplifyOrInst - Given operands for an Or, see if we can
|
2009-11-09 22:57:59 +00:00
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyOrInst(Value *Op0, Value *Op1, const Query &Q,
|
|
|
|
unsigned MaxRecurse) {
|
2009-11-10 00:55:12 +00:00
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
|
|
|
return ConstantFoldInstOperands(Instruction::Or, CLHS->getType(),
|
2012-03-13 11:42:19 +00:00
|
|
|
Ops, Q.TD, Q.TLI);
|
2009-11-10 00:55:12 +00:00
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// Canonicalize the constant to the RHS.
|
|
|
|
std::swap(Op0, Op1);
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// X | undef -> -1
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op1, m_Undef()))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Constant::getAllOnesValue(Op0->getType());
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// X | X = X
|
2011-01-01 20:08:02 +00:00
|
|
|
if (Op0 == Op1)
|
2009-11-10 00:55:12 +00:00
|
|
|
return Op0;
|
|
|
|
|
2010-11-17 18:52:15 +00:00
|
|
|
// X | 0 = X
|
|
|
|
if (match(Op1, m_Zero()))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Op0;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-11-17 18:52:15 +00:00
|
|
|
// X | -1 = -1
|
|
|
|
if (match(Op1, m_AllOnes()))
|
|
|
|
return Op1;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// A | ~A = ~A | A = -1
|
2011-02-09 17:15:04 +00:00
|
|
|
if (match(Op0, m_Not(m_Specific(Op1))) ||
|
|
|
|
match(Op1, m_Not(m_Specific(Op0))))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Constant::getAllOnesValue(Op0->getType());
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// (A & ?) | A = A
|
2011-02-09 17:15:04 +00:00
|
|
|
Value *A = 0, *B = 0;
|
2009-11-10 00:55:12 +00:00
|
|
|
if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
|
2011-01-01 20:08:02 +00:00
|
|
|
(A == Op1 || B == Op1))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Op1;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// A | (A & ?) = A
|
|
|
|
if (match(Op1, m_And(m_Value(A), m_Value(B))) &&
|
2011-01-01 20:08:02 +00:00
|
|
|
(A == Op0 || B == Op0))
|
2009-11-10 00:55:12 +00:00
|
|
|
return Op0;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2011-02-20 15:20:01 +00:00
|
|
|
// ~(A & ?) | A = -1
|
|
|
|
if (match(Op0, m_Not(m_And(m_Value(A), m_Value(B)))) &&
|
|
|
|
(A == Op1 || B == Op1))
|
|
|
|
return Constant::getAllOnesValue(Op1->getType());
|
|
|
|
|
|
|
|
// A | ~(A & ?) = -1
|
|
|
|
if (match(Op1, m_Not(m_And(m_Value(A), m_Value(B)))) &&
|
|
|
|
(A == Op0 || B == Op0))
|
|
|
|
return Constant::getAllOnesValue(Op0->getType());
|
|
|
|
|
2010-12-21 08:49:00 +00:00
|
|
|
// Try some generic simplifications for associative operations.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyAssociativeBinOp(Instruction::Or, Op0, Op1, Q,
|
|
|
|
MaxRecurse))
|
2010-12-21 08:49:00 +00:00
|
|
|
return V;
|
2010-09-10 22:39:55 +00:00
|
|
|
|
2010-12-21 13:32:22 +00:00
|
|
|
// Or distributes over And. Try some generic simplifications based on this.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ExpandBinOp(Instruction::Or, Op0, Op1, Instruction::And, Q,
|
|
|
|
MaxRecurse))
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// And distributes over Or. Try some generic simplifications based on this.
|
|
|
|
if (Value *V = FactorizeBinOp(Instruction::Or, Op0, Op1, Instruction::And,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
|
|
|
|
2010-11-10 13:00:08 +00:00
|
|
|
// If the operation is with the result of a select instruction, check whether
|
|
|
|
// operating on either branch of the select always yields the same value.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverSelect(Instruction::Or, Op0, Op1, Q,
|
2010-12-21 09:09:15 +00:00
|
|
|
MaxRecurse))
|
2010-11-10 18:23:01 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the operation is with the result of a phi instruction, check whether
|
|
|
|
// operating on all incoming values of the phi always yields the same value.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverPHI(Instruction::Or, Op0, Op1, Q, MaxRecurse))
|
2010-11-10 13:00:08 +00:00
|
|
|
return V;
|
|
|
|
|
2009-11-09 22:57:59 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyOrInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2010-11-16 12:16:38 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyOrInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2010-11-10 18:23:01 +00:00
|
|
|
}
|
2009-11-10 00:55:12 +00:00
|
|
|
|
2010-11-17 18:52:15 +00:00
|
|
|
/// SimplifyXorInst - Given operands for a Xor, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyXorInst(Value *Op0, Value *Op1, const Query &Q,
|
|
|
|
unsigned MaxRecurse) {
|
2010-11-17 18:52:15 +00:00
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
|
|
|
Constant *Ops[] = { CLHS, CRHS };
|
|
|
|
return ConstantFoldInstOperands(Instruction::Xor, CLHS->getType(),
|
2012-03-13 11:42:19 +00:00
|
|
|
Ops, Q.TD, Q.TLI);
|
2010-11-17 18:52:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Canonicalize the constant to the RHS.
|
|
|
|
std::swap(Op0, Op1);
|
|
|
|
}
|
|
|
|
|
|
|
|
// A ^ undef -> undef
|
2011-02-01 09:06:20 +00:00
|
|
|
if (match(Op1, m_Undef()))
|
2010-12-15 11:02:22 +00:00
|
|
|
return Op1;
|
2010-11-17 18:52:15 +00:00
|
|
|
|
|
|
|
// A ^ 0 = A
|
|
|
|
if (match(Op1, m_Zero()))
|
|
|
|
return Op0;
|
|
|
|
|
2011-08-17 19:31:49 +00:00
|
|
|
// A ^ A = 0
|
|
|
|
if (Op0 == Op1)
|
|
|
|
return Constant::getNullValue(Op0->getType());
|
|
|
|
|
2010-11-17 18:52:15 +00:00
|
|
|
// A ^ ~A = ~A ^ A = -1
|
2011-02-09 17:15:04 +00:00
|
|
|
if (match(Op0, m_Not(m_Specific(Op1))) ||
|
|
|
|
match(Op1, m_Not(m_Specific(Op0))))
|
2010-11-17 18:52:15 +00:00
|
|
|
return Constant::getAllOnesValue(Op0->getType());
|
|
|
|
|
2010-12-21 08:49:00 +00:00
|
|
|
// Try some generic simplifications for associative operations.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyAssociativeBinOp(Instruction::Xor, Op0, Op1, Q,
|
|
|
|
MaxRecurse))
|
2010-12-21 08:49:00 +00:00
|
|
|
return V;
|
2010-11-17 18:52:15 +00:00
|
|
|
|
2010-12-21 13:32:22 +00:00
|
|
|
// And distributes over Xor. Try some generic simplifications based on this.
|
|
|
|
if (Value *V = FactorizeBinOp(Instruction::Xor, Op0, Op1, Instruction::And,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse))
|
2010-12-21 13:32:22 +00:00
|
|
|
return V;
|
|
|
|
|
2010-11-19 09:20:39 +00:00
|
|
|
// Threading Xor over selects and phi nodes is pointless, so don't bother.
|
|
|
|
// Threading over the select in "A ^ select(cond, B, C)" means evaluating
|
|
|
|
// "A^B" and "A^C" and seeing if they are equal; but they are equal if and
|
|
|
|
// only if B and C are equal. If B and C are equal then (since we assume
|
|
|
|
// that operands have already been simplified) "select(cond, B, C)" should
|
|
|
|
// have been simplified to the common value of B and C already. Analysing
|
|
|
|
// "A^B" and "A^C" thus gains nothing, but costs compile time. Similarly
|
|
|
|
// for threading over phi nodes.
|
2010-11-17 18:52:15 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyXorInst(Value *Op0, Value *Op1, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2010-11-17 18:52:15 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyXorInst(Op0, Op1, Query (TD, TLI, DT), RecursionLimit);
|
2010-11-17 18:52:15 +00:00
|
|
|
}
|
|
|
|
|
2011-07-18 04:54:35 +00:00
|
|
|
static Type *GetCompareTy(Value *Op) {
|
2009-11-09 23:55:12 +00:00
|
|
|
return CmpInst::makeCmpResultType(Op->getType());
|
|
|
|
}
|
|
|
|
|
2011-05-07 16:56:49 +00:00
|
|
|
/// ExtractEquivalentCondition - Rummage around inside V looking for something
|
|
|
|
/// equivalent to the comparison "LHS Pred RHS". Return such a value if found,
|
|
|
|
/// otherwise return null. Helper function for analyzing max/min idioms.
|
|
|
|
static Value *ExtractEquivalentCondition(Value *V, CmpInst::Predicate Pred,
|
|
|
|
Value *LHS, Value *RHS) {
|
|
|
|
SelectInst *SI = dyn_cast<SelectInst>(V);
|
|
|
|
if (!SI)
|
|
|
|
return 0;
|
|
|
|
CmpInst *Cmp = dyn_cast<CmpInst>(SI->getCondition());
|
|
|
|
if (!Cmp)
|
|
|
|
return 0;
|
|
|
|
Value *CmpLHS = Cmp->getOperand(0), *CmpRHS = Cmp->getOperand(1);
|
|
|
|
if (Pred == Cmp->getPredicate() && LHS == CmpLHS && RHS == CmpRHS)
|
|
|
|
return Cmp;
|
|
|
|
if (Pred == CmpInst::getSwappedPredicate(Cmp->getPredicate()) &&
|
|
|
|
LHS == CmpRHS && RHS == CmpLHS)
|
|
|
|
return Cmp;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
static Constant *computePointerICmp(const DataLayout &TD,
|
2012-03-25 21:28:14 +00:00
|
|
|
CmpInst::Predicate Pred,
|
|
|
|
Value *LHS, Value *RHS) {
|
|
|
|
// We can only fold certain predicates on pointer comparisons.
|
|
|
|
switch (Pred) {
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
// Equality comaprisons are easy to fold.
|
|
|
|
case CmpInst::ICMP_EQ:
|
|
|
|
case CmpInst::ICMP_NE:
|
|
|
|
break;
|
|
|
|
|
|
|
|
// We can only handle unsigned relational comparisons because 'inbounds' on
|
|
|
|
// a GEP only protects against unsigned wrapping.
|
|
|
|
case CmpInst::ICMP_UGT:
|
|
|
|
case CmpInst::ICMP_UGE:
|
|
|
|
case CmpInst::ICMP_ULT:
|
|
|
|
case CmpInst::ICMP_ULE:
|
|
|
|
// However, we have to switch them to their signed variants to handle
|
|
|
|
// negative indices from the base pointer.
|
|
|
|
Pred = ICmpInst::getSignedPredicate(Pred);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
Constant *LHSOffset = stripAndComputeConstantOffsets(TD, LHS);
|
|
|
|
Constant *RHSOffset = stripAndComputeConstantOffsets(TD, RHS);
|
|
|
|
|
|
|
|
// If LHS and RHS are not related via constant offsets to the same base
|
|
|
|
// value, there is nothing we can do here.
|
|
|
|
if (LHS != RHS)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return ConstantExpr::getICmp(Pred, LHSOffset, RHSOffset);
|
|
|
|
}
|
2012-02-24 19:01:58 +00:00
|
|
|
|
2009-11-09 23:28:39 +00:00
|
|
|
/// SimplifyICmpInst - Given operands for an ICmpInst, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2010-11-10 18:23:01 +00:00
|
|
|
static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2009-11-09 22:57:59 +00:00
|
|
|
CmpInst::Predicate Pred = (CmpInst::Predicate)Predicate;
|
2009-11-09 23:28:39 +00:00
|
|
|
assert(CmpInst::isIntPredicate(Pred) && "Not an integer compare!");
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(LHS)) {
|
2009-11-09 23:06:58 +00:00
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(RHS))
|
2012-03-13 11:42:19 +00:00
|
|
|
return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, Q.TD, Q.TLI);
|
2009-11-10 00:55:12 +00:00
|
|
|
|
|
|
|
// If we have a constant, make sure it is on the RHS.
|
|
|
|
std::swap(LHS, RHS);
|
|
|
|
Pred = CmpInst::getSwappedPredicate(Pred);
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2011-07-18 04:54:35 +00:00
|
|
|
Type *ITy = GetCompareTy(LHS); // The return type.
|
|
|
|
Type *OpTy = LHS->getType(); // The operand type.
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-09 23:55:12 +00:00
|
|
|
// icmp X, X -> true/false
|
2010-03-03 19:46:03 +00:00
|
|
|
// X icmp undef -> true/false. For example, icmp ugt %X, undef -> false
|
|
|
|
// because X could be 0.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (LHS == RHS || isa<UndefValue>(RHS))
|
2009-11-09 23:55:12 +00:00
|
|
|
return ConstantInt::get(ITy, CmpInst::isTrueWhenEqual(Pred));
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2011-01-13 08:56:29 +00:00
|
|
|
// Special case logic when the operands have i1 type.
|
2011-12-01 02:39:36 +00:00
|
|
|
if (OpTy->getScalarType()->isIntegerTy(1)) {
|
2011-01-13 08:56:29 +00:00
|
|
|
switch (Pred) {
|
|
|
|
default: break;
|
|
|
|
case ICmpInst::ICMP_EQ:
|
|
|
|
// X == 1 -> X
|
|
|
|
if (match(RHS, m_One()))
|
|
|
|
return LHS;
|
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_NE:
|
|
|
|
// X != 0 -> X
|
|
|
|
if (match(RHS, m_Zero()))
|
|
|
|
return LHS;
|
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_UGT:
|
|
|
|
// X >u 0 -> X
|
|
|
|
if (match(RHS, m_Zero()))
|
|
|
|
return LHS;
|
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_UGE:
|
|
|
|
// X >=u 1 -> X
|
|
|
|
if (match(RHS, m_One()))
|
|
|
|
return LHS;
|
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_SLT:
|
|
|
|
// X <s 0 -> X
|
|
|
|
if (match(RHS, m_Zero()))
|
|
|
|
return LHS;
|
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_SLE:
|
|
|
|
// X <=s -1 -> X
|
|
|
|
if (match(RHS, m_One()))
|
|
|
|
return LHS;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2012-02-26 02:09:49 +00:00
|
|
|
// icmp <object*>, <object*/null> - Different identified objects have
|
|
|
|
// different addresses (unless null), and what's more the address of an
|
|
|
|
// identified local is never equal to another argument (again, barring null).
|
|
|
|
// Note that generalizing to the case where LHS is a global variable address
|
|
|
|
// or null is pointless, since if both LHS and RHS are constants then we
|
|
|
|
// already constant folded the compare, and if only one of them is then we
|
|
|
|
// moved it to RHS already.
|
2012-02-16 15:19:59 +00:00
|
|
|
Value *LHSPtr = LHS->stripPointerCasts();
|
|
|
|
Value *RHSPtr = RHS->stripPointerCasts();
|
2012-02-18 03:29:25 +00:00
|
|
|
if (LHSPtr == RHSPtr)
|
|
|
|
return ConstantInt::get(ITy, CmpInst::isTrueWhenEqual(Pred));
|
2012-02-26 02:09:49 +00:00
|
|
|
|
fold comparisons of gep'd alloca points with null to false,
implementing PR12013. We now compile the testcase to:
__Z4testv: ## @_Z4testv
## BB#0: ## %_ZN4llvm15SmallVectorImplIiE9push_backERKi.exit
pushq %rbx
subq $64, %rsp
leaq 32(%rsp), %rbx
movq %rbx, (%rsp)
leaq 64(%rsp), %rax
movq %rax, 16(%rsp)
movl $1, 32(%rsp)
leaq 36(%rsp), %rax
movq %rax, 8(%rsp)
leaq (%rsp), %rdi
callq __Z1gRN4llvm11SmallVectorIiLj8EEE
movq (%rsp), %rdi
cmpq %rbx, %rdi
je LBB0_2
## BB#1:
callq _free
LBB0_2: ## %_ZN4llvm11SmallVectorIiLj8EED1Ev.exit
addq $64, %rsp
popq %rbx
ret
instead of:
__Z4testv: ## @_Z4testv
## BB#0:
pushq %rbx
subq $64, %rsp
xorl %eax, %eax
leaq (%rsp), %rbx
addq $32, %rbx
movq %rbx, (%rsp)
movq %rbx, 8(%rsp)
leaq 64(%rsp), %rcx
movq %rcx, 16(%rsp)
je LBB0_2
## BB#1:
movl $1, 32(%rsp)
movq %rbx, %rax
LBB0_2: ## %_ZN4llvm15SmallVectorImplIiE9push_backERKi.exit
addq $4, %rax
movq %rax, 8(%rsp)
leaq (%rsp), %rdi
callq __Z1gRN4llvm11SmallVectorIiLj8EEE
movq (%rsp), %rdi
cmpq %rbx, %rdi
je LBB0_4
## BB#3:
callq _free
LBB0_4: ## %_ZN4llvm11SmallVectorIiLj8EED1Ev.exit
addq $64, %rsp
popq %rbx
ret
This doesn't shrink clang noticably though.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150944 91177308-0d34-0410-b5e6-96231b3b80d8
2012-02-20 00:42:49 +00:00
|
|
|
// Be more aggressive about stripping pointer adjustments when checking a
|
|
|
|
// comparison of an alloca address to another object. We can rip off all
|
|
|
|
// inbounds GEP operations, even if they are variable.
|
2012-03-10 08:39:09 +00:00
|
|
|
LHSPtr = LHSPtr->stripInBoundsOffsets();
|
2012-02-26 02:09:49 +00:00
|
|
|
if (llvm::isIdentifiedObject(LHSPtr)) {
|
2012-03-10 08:39:09 +00:00
|
|
|
RHSPtr = RHSPtr->stripInBoundsOffsets();
|
2012-02-26 02:09:49 +00:00
|
|
|
if (llvm::isKnownNonNull(LHSPtr) || llvm::isKnownNonNull(RHSPtr)) {
|
|
|
|
// If both sides are different identified objects, they aren't equal
|
|
|
|
// unless they're null.
|
2012-03-10 17:56:03 +00:00
|
|
|
if (LHSPtr != RHSPtr && llvm::isIdentifiedObject(RHSPtr) &&
|
2012-03-10 18:20:55 +00:00
|
|
|
Pred == CmpInst::ICMP_EQ)
|
2012-03-10 17:56:03 +00:00
|
|
|
return ConstantInt::get(ITy, false);
|
2012-02-26 02:09:49 +00:00
|
|
|
|
|
|
|
// A local identified object (alloca or noalias call) can't equal any
|
2012-08-07 10:59:59 +00:00
|
|
|
// incoming argument, unless they're both null or they belong to
|
|
|
|
// different functions. The latter happens during inlining.
|
|
|
|
if (Instruction *LHSInst = dyn_cast<Instruction>(LHSPtr))
|
|
|
|
if (Argument *RHSArg = dyn_cast<Argument>(RHSPtr))
|
|
|
|
if (LHSInst->getParent()->getParent() == RHSArg->getParent() &&
|
|
|
|
Pred == CmpInst::ICMP_EQ)
|
|
|
|
return ConstantInt::get(ITy, false);
|
2012-02-26 02:09:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Assume that the constant null is on the right.
|
2012-03-10 17:56:03 +00:00
|
|
|
if (llvm::isKnownNonNull(LHSPtr) && isa<ConstantPointerNull>(RHSPtr)) {
|
2012-03-10 18:20:55 +00:00
|
|
|
if (Pred == CmpInst::ICMP_EQ)
|
2012-03-10 17:56:03 +00:00
|
|
|
return ConstantInt::get(ITy, false);
|
2012-03-10 18:20:55 +00:00
|
|
|
else if (Pred == CmpInst::ICMP_NE)
|
2012-03-10 17:56:03 +00:00
|
|
|
return ConstantInt::get(ITy, true);
|
|
|
|
}
|
2012-08-07 10:59:59 +00:00
|
|
|
} else if (Argument *LHSArg = dyn_cast<Argument>(LHSPtr)) {
|
2012-03-10 08:39:09 +00:00
|
|
|
RHSPtr = RHSPtr->stripInBoundsOffsets();
|
2012-08-07 10:59:59 +00:00
|
|
|
// An alloca can't be equal to an argument unless they come from separate
|
|
|
|
// functions via inlining.
|
|
|
|
if (AllocaInst *RHSInst = dyn_cast<AllocaInst>(RHSPtr)) {
|
|
|
|
if (LHSArg->getParent() == RHSInst->getParent()->getParent()) {
|
|
|
|
if (Pred == CmpInst::ICMP_EQ)
|
|
|
|
return ConstantInt::get(ITy, false);
|
|
|
|
else if (Pred == CmpInst::ICMP_NE)
|
|
|
|
return ConstantInt::get(ITy, true);
|
|
|
|
}
|
2012-03-10 17:56:03 +00:00
|
|
|
}
|
fold comparisons of gep'd alloca points with null to false,
implementing PR12013. We now compile the testcase to:
__Z4testv: ## @_Z4testv
## BB#0: ## %_ZN4llvm15SmallVectorImplIiE9push_backERKi.exit
pushq %rbx
subq $64, %rsp
leaq 32(%rsp), %rbx
movq %rbx, (%rsp)
leaq 64(%rsp), %rax
movq %rax, 16(%rsp)
movl $1, 32(%rsp)
leaq 36(%rsp), %rax
movq %rax, 8(%rsp)
leaq (%rsp), %rdi
callq __Z1gRN4llvm11SmallVectorIiLj8EEE
movq (%rsp), %rdi
cmpq %rbx, %rdi
je LBB0_2
## BB#1:
callq _free
LBB0_2: ## %_ZN4llvm11SmallVectorIiLj8EED1Ev.exit
addq $64, %rsp
popq %rbx
ret
instead of:
__Z4testv: ## @_Z4testv
## BB#0:
pushq %rbx
subq $64, %rsp
xorl %eax, %eax
leaq (%rsp), %rbx
addq $32, %rbx
movq %rbx, (%rsp)
movq %rbx, 8(%rsp)
leaq 64(%rsp), %rcx
movq %rcx, 16(%rsp)
je LBB0_2
## BB#1:
movl $1, 32(%rsp)
movq %rbx, %rax
LBB0_2: ## %_ZN4llvm15SmallVectorImplIiE9push_backERKi.exit
addq $4, %rax
movq %rax, 8(%rsp)
leaq (%rsp), %rdi
callq __Z1gRN4llvm11SmallVectorIiLj8EEE
movq (%rsp), %rdi
cmpq %rbx, %rdi
je LBB0_4
## BB#3:
callq _free
LBB0_4: ## %_ZN4llvm11SmallVectorIiLj8EED1Ev.exit
addq $64, %rsp
popq %rbx
ret
This doesn't shrink clang noticably though.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150944 91177308-0d34-0410-b5e6-96231b3b80d8
2012-02-20 00:42:49 +00:00
|
|
|
}
|
2011-01-25 09:38:29 +00:00
|
|
|
|
|
|
|
// If we are comparing with zero then try hard since this is a common case.
|
|
|
|
if (match(RHS, m_Zero())) {
|
|
|
|
bool LHSKnownNonNegative, LHSKnownNegative;
|
|
|
|
switch (Pred) {
|
2012-02-07 05:05:23 +00:00
|
|
|
default: llvm_unreachable("Unknown ICmp predicate!");
|
2011-01-25 09:38:29 +00:00
|
|
|
case ICmpInst::ICMP_ULT:
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
case ICmpInst::ICMP_UGE:
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
case ICmpInst::ICMP_EQ:
|
|
|
|
case ICmpInst::ICMP_ULE:
|
2012-03-13 11:42:19 +00:00
|
|
|
if (isKnownNonZero(LHS, Q.TD))
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_NE:
|
|
|
|
case ICmpInst::ICMP_UGT:
|
2012-03-13 11:42:19 +00:00
|
|
|
if (isKnownNonZero(LHS, Q.TD))
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_SLT:
|
2012-03-13 11:42:19 +00:00
|
|
|
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.TD);
|
2011-01-25 09:38:29 +00:00
|
|
|
if (LHSKnownNegative)
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
if (LHSKnownNonNegative)
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_SLE:
|
2012-03-13 11:42:19 +00:00
|
|
|
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.TD);
|
2011-01-25 09:38:29 +00:00
|
|
|
if (LHSKnownNegative)
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2012-03-13 11:42:19 +00:00
|
|
|
if (LHSKnownNonNegative && isKnownNonZero(LHS, Q.TD))
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_SGE:
|
2012-03-13 11:42:19 +00:00
|
|
|
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.TD);
|
2011-01-25 09:38:29 +00:00
|
|
|
if (LHSKnownNegative)
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
if (LHSKnownNonNegative)
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_SGT:
|
2012-03-13 11:42:19 +00:00
|
|
|
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, Q.TD);
|
2011-01-25 09:38:29 +00:00
|
|
|
if (LHSKnownNegative)
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2012-03-13 11:42:19 +00:00
|
|
|
if (LHSKnownNonNegative && isKnownNonZero(LHS, Q.TD))
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-01-25 09:38:29 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// See if we are doing a comparison with a constant integer.
|
2009-11-09 23:55:12 +00:00
|
|
|
if (ConstantInt *CI = dyn_cast<ConstantInt>(RHS)) {
|
2011-03-04 07:00:57 +00:00
|
|
|
// Rule out tautological comparisons (eg., ult 0 or uge 0).
|
|
|
|
ConstantRange RHS_CR = ICmpInst::makeConstantRange(Pred, CI->getValue());
|
|
|
|
if (RHS_CR.isEmptySet())
|
|
|
|
return ConstantInt::getFalse(CI->getContext());
|
|
|
|
if (RHS_CR.isFullSet())
|
|
|
|
return ConstantInt::getTrue(CI->getContext());
|
|
|
|
|
|
|
|
// Many binary operators with constant RHS have easy to compute constant
|
|
|
|
// range. Use them to check whether the comparison is a tautology.
|
|
|
|
uint32_t Width = CI->getBitWidth();
|
|
|
|
APInt Lower = APInt(Width, 0);
|
|
|
|
APInt Upper = APInt(Width, 0);
|
|
|
|
ConstantInt *CI2;
|
|
|
|
if (match(LHS, m_URem(m_Value(), m_ConstantInt(CI2)))) {
|
|
|
|
// 'urem x, CI2' produces [0, CI2).
|
|
|
|
Upper = CI2->getValue();
|
|
|
|
} else if (match(LHS, m_SRem(m_Value(), m_ConstantInt(CI2)))) {
|
|
|
|
// 'srem x, CI2' produces (-|CI2|, |CI2|).
|
|
|
|
Upper = CI2->getValue().abs();
|
|
|
|
Lower = (-Upper) + 1;
|
2011-10-28 18:17:44 +00:00
|
|
|
} else if (match(LHS, m_UDiv(m_ConstantInt(CI2), m_Value()))) {
|
|
|
|
// 'udiv CI2, x' produces [0, CI2].
|
2011-11-08 21:08:02 +00:00
|
|
|
Upper = CI2->getValue() + 1;
|
2011-03-04 07:00:57 +00:00
|
|
|
} else if (match(LHS, m_UDiv(m_Value(), m_ConstantInt(CI2)))) {
|
|
|
|
// 'udiv x, CI2' produces [0, UINT_MAX / CI2].
|
|
|
|
APInt NegOne = APInt::getAllOnesValue(Width);
|
|
|
|
if (!CI2->isZero())
|
|
|
|
Upper = NegOne.udiv(CI2->getValue()) + 1;
|
|
|
|
} else if (match(LHS, m_SDiv(m_Value(), m_ConstantInt(CI2)))) {
|
|
|
|
// 'sdiv x, CI2' produces [INT_MIN / CI2, INT_MAX / CI2].
|
|
|
|
APInt IntMin = APInt::getSignedMinValue(Width);
|
|
|
|
APInt IntMax = APInt::getSignedMaxValue(Width);
|
|
|
|
APInt Val = CI2->getValue().abs();
|
|
|
|
if (!Val.isMinValue()) {
|
|
|
|
Lower = IntMin.sdiv(Val);
|
|
|
|
Upper = IntMax.sdiv(Val) + 1;
|
|
|
|
}
|
|
|
|
} else if (match(LHS, m_LShr(m_Value(), m_ConstantInt(CI2)))) {
|
|
|
|
// 'lshr x, CI2' produces [0, UINT_MAX >> CI2].
|
|
|
|
APInt NegOne = APInt::getAllOnesValue(Width);
|
|
|
|
if (CI2->getValue().ult(Width))
|
|
|
|
Upper = NegOne.lshr(CI2->getValue()) + 1;
|
|
|
|
} else if (match(LHS, m_AShr(m_Value(), m_ConstantInt(CI2)))) {
|
|
|
|
// 'ashr x, CI2' produces [INT_MIN >> CI2, INT_MAX >> CI2].
|
|
|
|
APInt IntMin = APInt::getSignedMinValue(Width);
|
|
|
|
APInt IntMax = APInt::getSignedMaxValue(Width);
|
|
|
|
if (CI2->getValue().ult(Width)) {
|
|
|
|
Lower = IntMin.ashr(CI2->getValue());
|
|
|
|
Upper = IntMax.ashr(CI2->getValue()) + 1;
|
|
|
|
}
|
|
|
|
} else if (match(LHS, m_Or(m_Value(), m_ConstantInt(CI2)))) {
|
|
|
|
// 'or x, CI2' produces [CI2, UINT_MAX].
|
|
|
|
Lower = CI2->getValue();
|
|
|
|
} else if (match(LHS, m_And(m_Value(), m_ConstantInt(CI2)))) {
|
|
|
|
// 'and x, CI2' produces [0, CI2].
|
|
|
|
Upper = CI2->getValue() + 1;
|
|
|
|
}
|
|
|
|
if (Lower != Upper) {
|
|
|
|
ConstantRange LHS_CR = ConstantRange(Lower, Upper);
|
|
|
|
if (RHS_CR.contains(LHS_CR))
|
|
|
|
return ConstantInt::getTrue(RHS->getContext());
|
|
|
|
if (RHS_CR.inverse().contains(LHS_CR))
|
|
|
|
return ConstantInt::getFalse(RHS->getContext());
|
2009-11-09 23:55:12 +00:00
|
|
|
}
|
|
|
|
}
|
2010-11-07 16:12:23 +00:00
|
|
|
|
2011-01-20 13:21:55 +00:00
|
|
|
// Compare of cast, for example (zext X) != 0 -> X != 0
|
|
|
|
if (isa<CastInst>(LHS) && (isa<Constant>(RHS) || isa<CastInst>(RHS))) {
|
|
|
|
Instruction *LI = cast<CastInst>(LHS);
|
|
|
|
Value *SrcOp = LI->getOperand(0);
|
2011-07-18 04:54:35 +00:00
|
|
|
Type *SrcTy = SrcOp->getType();
|
|
|
|
Type *DstTy = LI->getType();
|
2011-01-20 13:21:55 +00:00
|
|
|
|
|
|
|
// Turn icmp (ptrtoint x), (ptrtoint/constant) into a compare of the input
|
|
|
|
// if the integer type is the same size as the pointer type.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (MaxRecurse && Q.TD && isa<PtrToIntInst>(LI) &&
|
Revert the majority of the next patch in the address space series:
r165941: Resubmit the changes to llvm core to update the functions to
support different pointer sizes on a per address space basis.
Despite this commit log, this change primarily changed stuff outside of
VMCore, and those changes do not carry any tests for correctness (or
even plausibility), and we have consistently found questionable or flat
out incorrect cases in these changes. Most of them are probably correct,
but we need to devise a system that makes it more clear when we have
handled the address space concerns correctly, and ideally each pass that
gets updated would receive an accompanying test case that exercises that
pass specificaly w.r.t. alternate address spaces.
However, from this commit, I have retained the new C API entry points.
Those were an orthogonal change that probably should have been split
apart, but they seem entirely good.
In several places the changes were very obvious cleanups with no actual
multiple address space code added; these I have not reverted when
I spotted them.
In a few other places there were merge conflicts due to a cleaner
solution being implemented later, often not using address spaces at all.
In those cases, I've preserved the new code which isn't address space
dependent.
This is part of my ongoing effort to clean out the partial address space
code which carries high risk and low test coverage, and not likely to be
finished before the 3.2 release looms closer. Duncan and I would both
like to see the above issues addressed before we return to these
changes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167222 91177308-0d34-0410-b5e6-96231b3b80d8
2012-11-01 09:14:31 +00:00
|
|
|
Q.TD->getPointerSizeInBits() == DstTy->getPrimitiveSizeInBits()) {
|
2011-01-20 13:21:55 +00:00
|
|
|
if (Constant *RHSC = dyn_cast<Constant>(RHS)) {
|
|
|
|
// Transfer the cast to the constant.
|
|
|
|
if (Value *V = SimplifyICmpInst(Pred, SrcOp,
|
|
|
|
ConstantExpr::getIntToPtr(RHSC, SrcTy),
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse-1))
|
2011-01-20 13:21:55 +00:00
|
|
|
return V;
|
|
|
|
} else if (PtrToIntInst *RI = dyn_cast<PtrToIntInst>(RHS)) {
|
|
|
|
if (RI->getOperand(0)->getType() == SrcTy)
|
|
|
|
// Compare without the cast.
|
|
|
|
if (Value *V = SimplifyICmpInst(Pred, SrcOp, RI->getOperand(0),
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse-1))
|
2011-01-20 13:21:55 +00:00
|
|
|
return V;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isa<ZExtInst>(LHS)) {
|
|
|
|
// Turn icmp (zext X), (zext Y) into a compare of X and Y if they have the
|
|
|
|
// same type.
|
|
|
|
if (ZExtInst *RI = dyn_cast<ZExtInst>(RHS)) {
|
|
|
|
if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
|
|
|
|
// Compare X and Y. Note that signed predicates become unsigned.
|
|
|
|
if (Value *V = SimplifyICmpInst(ICmpInst::getUnsignedPredicate(Pred),
|
2012-03-13 11:42:19 +00:00
|
|
|
SrcOp, RI->getOperand(0), Q,
|
2011-01-20 13:21:55 +00:00
|
|
|
MaxRecurse-1))
|
|
|
|
return V;
|
|
|
|
}
|
|
|
|
// Turn icmp (zext X), Cst into a compare of X and Cst if Cst is extended
|
|
|
|
// too. If not, then try to deduce the result of the comparison.
|
|
|
|
else if (ConstantInt *CI = dyn_cast<ConstantInt>(RHS)) {
|
|
|
|
// Compute the constant that would happen if we truncated to SrcTy then
|
|
|
|
// reextended to DstTy.
|
|
|
|
Constant *Trunc = ConstantExpr::getTrunc(CI, SrcTy);
|
|
|
|
Constant *RExt = ConstantExpr::getCast(CastInst::ZExt, Trunc, DstTy);
|
|
|
|
|
|
|
|
// If the re-extended constant didn't change then this is effectively
|
|
|
|
// also a case of comparing two zero-extended values.
|
|
|
|
if (RExt == CI && MaxRecurse)
|
|
|
|
if (Value *V = SimplifyICmpInst(ICmpInst::getUnsignedPredicate(Pred),
|
2012-03-13 11:42:19 +00:00
|
|
|
SrcOp, Trunc, Q, MaxRecurse-1))
|
2011-01-20 13:21:55 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// Otherwise the upper bits of LHS are zero while RHS has a non-zero bit
|
|
|
|
// there. Use this to work out the result of the comparison.
|
|
|
|
if (RExt != CI) {
|
|
|
|
switch (Pred) {
|
2012-02-07 05:05:23 +00:00
|
|
|
default: llvm_unreachable("Unknown ICmp predicate!");
|
2011-01-20 13:21:55 +00:00
|
|
|
// LHS <u RHS.
|
|
|
|
case ICmpInst::ICMP_EQ:
|
|
|
|
case ICmpInst::ICMP_UGT:
|
|
|
|
case ICmpInst::ICMP_UGE:
|
|
|
|
return ConstantInt::getFalse(CI->getContext());
|
|
|
|
|
|
|
|
case ICmpInst::ICMP_NE:
|
|
|
|
case ICmpInst::ICMP_ULT:
|
|
|
|
case ICmpInst::ICMP_ULE:
|
|
|
|
return ConstantInt::getTrue(CI->getContext());
|
|
|
|
|
|
|
|
// LHS is non-negative. If RHS is negative then LHS >s LHS. If RHS
|
|
|
|
// is non-negative then LHS <s RHS.
|
|
|
|
case ICmpInst::ICMP_SGT:
|
|
|
|
case ICmpInst::ICMP_SGE:
|
|
|
|
return CI->getValue().isNegative() ?
|
|
|
|
ConstantInt::getTrue(CI->getContext()) :
|
|
|
|
ConstantInt::getFalse(CI->getContext());
|
|
|
|
|
|
|
|
case ICmpInst::ICMP_SLT:
|
|
|
|
case ICmpInst::ICMP_SLE:
|
|
|
|
return CI->getValue().isNegative() ?
|
|
|
|
ConstantInt::getFalse(CI->getContext()) :
|
|
|
|
ConstantInt::getTrue(CI->getContext());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isa<SExtInst>(LHS)) {
|
|
|
|
// Turn icmp (sext X), (sext Y) into a compare of X and Y if they have the
|
|
|
|
// same type.
|
|
|
|
if (SExtInst *RI = dyn_cast<SExtInst>(RHS)) {
|
|
|
|
if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
|
|
|
|
// Compare X and Y. Note that the predicate does not change.
|
|
|
|
if (Value *V = SimplifyICmpInst(Pred, SrcOp, RI->getOperand(0),
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse-1))
|
2011-01-20 13:21:55 +00:00
|
|
|
return V;
|
|
|
|
}
|
|
|
|
// Turn icmp (sext X), Cst into a compare of X and Cst if Cst is extended
|
|
|
|
// too. If not, then try to deduce the result of the comparison.
|
|
|
|
else if (ConstantInt *CI = dyn_cast<ConstantInt>(RHS)) {
|
|
|
|
// Compute the constant that would happen if we truncated to SrcTy then
|
|
|
|
// reextended to DstTy.
|
|
|
|
Constant *Trunc = ConstantExpr::getTrunc(CI, SrcTy);
|
|
|
|
Constant *RExt = ConstantExpr::getCast(CastInst::SExt, Trunc, DstTy);
|
|
|
|
|
|
|
|
// If the re-extended constant didn't change then this is effectively
|
|
|
|
// also a case of comparing two sign-extended values.
|
|
|
|
if (RExt == CI && MaxRecurse)
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyICmpInst(Pred, SrcOp, Trunc, Q, MaxRecurse-1))
|
2011-01-20 13:21:55 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// Otherwise the upper bits of LHS are all equal, while RHS has varying
|
|
|
|
// bits there. Use this to work out the result of the comparison.
|
|
|
|
if (RExt != CI) {
|
|
|
|
switch (Pred) {
|
2012-02-07 05:05:23 +00:00
|
|
|
default: llvm_unreachable("Unknown ICmp predicate!");
|
2011-01-20 13:21:55 +00:00
|
|
|
case ICmpInst::ICMP_EQ:
|
|
|
|
return ConstantInt::getFalse(CI->getContext());
|
|
|
|
case ICmpInst::ICMP_NE:
|
|
|
|
return ConstantInt::getTrue(CI->getContext());
|
|
|
|
|
|
|
|
// If RHS is non-negative then LHS <s RHS. If RHS is negative then
|
|
|
|
// LHS >s RHS.
|
|
|
|
case ICmpInst::ICMP_SGT:
|
|
|
|
case ICmpInst::ICMP_SGE:
|
|
|
|
return CI->getValue().isNegative() ?
|
|
|
|
ConstantInt::getTrue(CI->getContext()) :
|
|
|
|
ConstantInt::getFalse(CI->getContext());
|
|
|
|
case ICmpInst::ICMP_SLT:
|
|
|
|
case ICmpInst::ICMP_SLE:
|
|
|
|
return CI->getValue().isNegative() ?
|
|
|
|
ConstantInt::getFalse(CI->getContext()) :
|
|
|
|
ConstantInt::getTrue(CI->getContext());
|
|
|
|
|
|
|
|
// If LHS is non-negative then LHS <u RHS. If LHS is negative then
|
|
|
|
// LHS >u RHS.
|
|
|
|
case ICmpInst::ICMP_UGT:
|
|
|
|
case ICmpInst::ICMP_UGE:
|
2012-09-27 10:14:43 +00:00
|
|
|
// Comparison is true iff the LHS <s 0.
|
2011-01-20 13:21:55 +00:00
|
|
|
if (MaxRecurse)
|
|
|
|
if (Value *V = SimplifyICmpInst(ICmpInst::ICMP_SLT, SrcOp,
|
|
|
|
Constant::getNullValue(SrcTy),
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse-1))
|
2011-01-20 13:21:55 +00:00
|
|
|
return V;
|
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_ULT:
|
|
|
|
case ICmpInst::ICMP_ULE:
|
2012-09-27 10:14:43 +00:00
|
|
|
// Comparison is true iff the LHS >=s 0.
|
2011-01-20 13:21:55 +00:00
|
|
|
if (MaxRecurse)
|
|
|
|
if (Value *V = SimplifyICmpInst(ICmpInst::ICMP_SGE, SrcOp,
|
|
|
|
Constant::getNullValue(SrcTy),
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse-1))
|
2011-01-20 13:21:55 +00:00
|
|
|
return V;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-02-13 17:15:40 +00:00
|
|
|
// Special logic for binary operators.
|
|
|
|
BinaryOperator *LBO = dyn_cast<BinaryOperator>(LHS);
|
|
|
|
BinaryOperator *RBO = dyn_cast<BinaryOperator>(RHS);
|
|
|
|
if (MaxRecurse && (LBO || RBO)) {
|
|
|
|
// Analyze the case when either LHS or RHS is an add instruction.
|
|
|
|
Value *A = 0, *B = 0, *C = 0, *D = 0;
|
|
|
|
// LHS = A + B (or A and B are null); RHS = C + D (or C and D are null).
|
|
|
|
bool NoLHSWrapProblem = false, NoRHSWrapProblem = false;
|
|
|
|
if (LBO && LBO->getOpcode() == Instruction::Add) {
|
|
|
|
A = LBO->getOperand(0); B = LBO->getOperand(1);
|
|
|
|
NoLHSWrapProblem = ICmpInst::isEquality(Pred) ||
|
|
|
|
(CmpInst::isUnsigned(Pred) && LBO->hasNoUnsignedWrap()) ||
|
|
|
|
(CmpInst::isSigned(Pred) && LBO->hasNoSignedWrap());
|
|
|
|
}
|
|
|
|
if (RBO && RBO->getOpcode() == Instruction::Add) {
|
|
|
|
C = RBO->getOperand(0); D = RBO->getOperand(1);
|
|
|
|
NoRHSWrapProblem = ICmpInst::isEquality(Pred) ||
|
|
|
|
(CmpInst::isUnsigned(Pred) && RBO->hasNoUnsignedWrap()) ||
|
|
|
|
(CmpInst::isSigned(Pred) && RBO->hasNoSignedWrap());
|
|
|
|
}
|
|
|
|
|
|
|
|
// icmp (X+Y), X -> icmp Y, 0 for equalities or if there is no overflow.
|
|
|
|
if ((A == RHS || B == RHS) && NoLHSWrapProblem)
|
|
|
|
if (Value *V = SimplifyICmpInst(Pred, A == RHS ? B : A,
|
|
|
|
Constant::getNullValue(RHS->getType()),
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse-1))
|
2011-02-13 17:15:40 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// icmp X, (X+Y) -> icmp 0, Y for equalities or if there is no overflow.
|
|
|
|
if ((C == LHS || D == LHS) && NoRHSWrapProblem)
|
|
|
|
if (Value *V = SimplifyICmpInst(Pred,
|
|
|
|
Constant::getNullValue(LHS->getType()),
|
2012-03-13 11:42:19 +00:00
|
|
|
C == LHS ? D : C, Q, MaxRecurse-1))
|
2011-02-13 17:15:40 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// icmp (X+Y), (X+Z) -> icmp Y,Z for equalities or if there is no overflow.
|
|
|
|
if (A && C && (A == C || A == D || B == C || B == D) &&
|
|
|
|
NoLHSWrapProblem && NoRHSWrapProblem) {
|
|
|
|
// Determine Y and Z in the form icmp (X+Y), (X+Z).
|
2012-11-16 19:41:26 +00:00
|
|
|
Value *Y, *Z;
|
|
|
|
if (A == C) {
|
2012-11-16 20:53:08 +00:00
|
|
|
// C + B == C + D -> B == D
|
2012-11-16 19:41:26 +00:00
|
|
|
Y = B;
|
|
|
|
Z = D;
|
|
|
|
} else if (A == D) {
|
2012-11-16 20:53:08 +00:00
|
|
|
// D + B == C + D -> B == C
|
2012-11-16 19:41:26 +00:00
|
|
|
Y = B;
|
|
|
|
Z = C;
|
|
|
|
} else if (B == C) {
|
2012-11-16 20:53:08 +00:00
|
|
|
// A + C == C + D -> A == D
|
2012-11-16 19:41:26 +00:00
|
|
|
Y = A;
|
|
|
|
Z = D;
|
2012-11-16 20:53:08 +00:00
|
|
|
} else {
|
|
|
|
assert(B == D);
|
|
|
|
// A + D == C + D -> A == C
|
2012-11-16 19:41:26 +00:00
|
|
|
Y = A;
|
|
|
|
Z = C;
|
|
|
|
}
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyICmpInst(Pred, Y, Z, Q, MaxRecurse-1))
|
2011-02-13 17:15:40 +00:00
|
|
|
return V;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-09 06:26:03 +00:00
|
|
|
if (LBO && match(LBO, m_URem(m_Value(), m_Specific(RHS)))) {
|
2011-03-04 10:06:52 +00:00
|
|
|
bool KnownNonNegative, KnownNegative;
|
2011-03-01 08:15:50 +00:00
|
|
|
switch (Pred) {
|
|
|
|
default:
|
|
|
|
break;
|
2011-03-04 10:06:52 +00:00
|
|
|
case ICmpInst::ICMP_SGT:
|
|
|
|
case ICmpInst::ICMP_SGE:
|
2012-03-13 11:42:19 +00:00
|
|
|
ComputeSignBit(LHS, KnownNonNegative, KnownNegative, Q.TD);
|
2011-03-04 10:06:52 +00:00
|
|
|
if (!KnownNonNegative)
|
|
|
|
break;
|
|
|
|
// fall-through
|
2011-03-01 08:15:50 +00:00
|
|
|
case ICmpInst::ICMP_EQ:
|
|
|
|
case ICmpInst::ICMP_UGT:
|
|
|
|
case ICmpInst::ICMP_UGE:
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-03-04 10:06:52 +00:00
|
|
|
case ICmpInst::ICMP_SLT:
|
|
|
|
case ICmpInst::ICMP_SLE:
|
2012-03-13 11:42:19 +00:00
|
|
|
ComputeSignBit(LHS, KnownNonNegative, KnownNegative, Q.TD);
|
2011-03-04 10:06:52 +00:00
|
|
|
if (!KnownNonNegative)
|
|
|
|
break;
|
|
|
|
// fall-through
|
2011-03-01 08:15:50 +00:00
|
|
|
case ICmpInst::ICMP_NE:
|
|
|
|
case ICmpInst::ICMP_ULT:
|
|
|
|
case ICmpInst::ICMP_ULE:
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-03-01 08:15:50 +00:00
|
|
|
}
|
|
|
|
}
|
2011-03-09 06:26:03 +00:00
|
|
|
if (RBO && match(RBO, m_URem(m_Value(), m_Specific(LHS)))) {
|
|
|
|
bool KnownNonNegative, KnownNegative;
|
|
|
|
switch (Pred) {
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
case ICmpInst::ICMP_SGT:
|
|
|
|
case ICmpInst::ICMP_SGE:
|
2012-03-13 11:42:19 +00:00
|
|
|
ComputeSignBit(RHS, KnownNonNegative, KnownNegative, Q.TD);
|
2011-03-09 06:26:03 +00:00
|
|
|
if (!KnownNonNegative)
|
|
|
|
break;
|
|
|
|
// fall-through
|
2011-03-09 08:20:06 +00:00
|
|
|
case ICmpInst::ICMP_NE:
|
2011-03-09 06:26:03 +00:00
|
|
|
case ICmpInst::ICMP_UGT:
|
|
|
|
case ICmpInst::ICMP_UGE:
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-03-09 06:26:03 +00:00
|
|
|
case ICmpInst::ICMP_SLT:
|
|
|
|
case ICmpInst::ICMP_SLE:
|
2012-03-13 11:42:19 +00:00
|
|
|
ComputeSignBit(RHS, KnownNonNegative, KnownNegative, Q.TD);
|
2011-03-09 06:26:03 +00:00
|
|
|
if (!KnownNonNegative)
|
|
|
|
break;
|
|
|
|
// fall-through
|
2011-03-09 08:20:06 +00:00
|
|
|
case ICmpInst::ICMP_EQ:
|
2011-03-09 06:26:03 +00:00
|
|
|
case ICmpInst::ICMP_ULT:
|
|
|
|
case ICmpInst::ICMP_ULE:
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-03-09 06:26:03 +00:00
|
|
|
}
|
|
|
|
}
|
2011-03-01 08:15:50 +00:00
|
|
|
|
2011-10-28 18:17:44 +00:00
|
|
|
// x udiv y <=u x.
|
|
|
|
if (LBO && match(LBO, m_UDiv(m_Specific(RHS), m_Value()))) {
|
|
|
|
// icmp pred (X /u Y), X
|
|
|
|
if (Pred == ICmpInst::ICMP_UGT)
|
|
|
|
return getFalse(ITy);
|
|
|
|
if (Pred == ICmpInst::ICMP_ULE)
|
|
|
|
return getTrue(ITy);
|
|
|
|
}
|
|
|
|
|
2011-03-05 05:19:11 +00:00
|
|
|
if (MaxRecurse && LBO && RBO && LBO->getOpcode() == RBO->getOpcode() &&
|
|
|
|
LBO->getOperand(1) == RBO->getOperand(1)) {
|
|
|
|
switch (LBO->getOpcode()) {
|
|
|
|
default: break;
|
|
|
|
case Instruction::UDiv:
|
|
|
|
case Instruction::LShr:
|
|
|
|
if (ICmpInst::isSigned(Pred))
|
|
|
|
break;
|
|
|
|
// fall-through
|
|
|
|
case Instruction::SDiv:
|
|
|
|
case Instruction::AShr:
|
2011-05-05 21:59:18 +00:00
|
|
|
if (!LBO->isExact() || !RBO->isExact())
|
2011-03-05 05:19:11 +00:00
|
|
|
break;
|
|
|
|
if (Value *V = SimplifyICmpInst(Pred, LBO->getOperand(0),
|
2012-03-13 11:42:19 +00:00
|
|
|
RBO->getOperand(0), Q, MaxRecurse-1))
|
2011-03-05 05:19:11 +00:00
|
|
|
return V;
|
|
|
|
break;
|
|
|
|
case Instruction::Shl: {
|
2011-08-04 10:02:21 +00:00
|
|
|
bool NUW = LBO->hasNoUnsignedWrap() && RBO->hasNoUnsignedWrap();
|
2011-03-05 05:19:11 +00:00
|
|
|
bool NSW = LBO->hasNoSignedWrap() && RBO->hasNoSignedWrap();
|
|
|
|
if (!NUW && !NSW)
|
|
|
|
break;
|
|
|
|
if (!NSW && ICmpInst::isSigned(Pred))
|
|
|
|
break;
|
|
|
|
if (Value *V = SimplifyICmpInst(Pred, LBO->getOperand(0),
|
2012-03-13 11:42:19 +00:00
|
|
|
RBO->getOperand(0), Q, MaxRecurse-1))
|
2011-03-05 05:19:11 +00:00
|
|
|
return V;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-03 19:53:10 +00:00
|
|
|
// Simplify comparisons involving max/min.
|
|
|
|
Value *A, *B;
|
|
|
|
CmpInst::Predicate P = CmpInst::BAD_ICMP_PREDICATE;
|
2012-09-27 10:14:43 +00:00
|
|
|
CmpInst::Predicate EqP; // Chosen so that "A == max/min(A,B)" iff "A EqP B".
|
2011-05-03 19:53:10 +00:00
|
|
|
|
2011-05-04 16:05:05 +00:00
|
|
|
// Signed variants on "max(a,b)>=a -> true".
|
2011-05-03 19:53:10 +00:00
|
|
|
if (match(LHS, m_SMax(m_Value(A), m_Value(B))) && (A == RHS || B == RHS)) {
|
|
|
|
if (A != RHS) std::swap(A, B); // smax(A, B) pred A.
|
2012-09-27 10:14:43 +00:00
|
|
|
EqP = CmpInst::ICMP_SGE; // "A == smax(A, B)" iff "A sge B".
|
2011-05-03 19:53:10 +00:00
|
|
|
// We analyze this as smax(A, B) pred A.
|
|
|
|
P = Pred;
|
|
|
|
} else if (match(RHS, m_SMax(m_Value(A), m_Value(B))) &&
|
|
|
|
(A == LHS || B == LHS)) {
|
|
|
|
if (A != LHS) std::swap(A, B); // A pred smax(A, B).
|
2012-09-27 10:14:43 +00:00
|
|
|
EqP = CmpInst::ICMP_SGE; // "A == smax(A, B)" iff "A sge B".
|
2011-05-03 19:53:10 +00:00
|
|
|
// We analyze this as smax(A, B) swapped-pred A.
|
|
|
|
P = CmpInst::getSwappedPredicate(Pred);
|
|
|
|
} else if (match(LHS, m_SMin(m_Value(A), m_Value(B))) &&
|
|
|
|
(A == RHS || B == RHS)) {
|
|
|
|
if (A != RHS) std::swap(A, B); // smin(A, B) pred A.
|
2012-09-27 10:14:43 +00:00
|
|
|
EqP = CmpInst::ICMP_SLE; // "A == smin(A, B)" iff "A sle B".
|
2011-05-03 19:53:10 +00:00
|
|
|
// We analyze this as smax(-A, -B) swapped-pred -A.
|
|
|
|
// Note that we do not need to actually form -A or -B thanks to EqP.
|
|
|
|
P = CmpInst::getSwappedPredicate(Pred);
|
|
|
|
} else if (match(RHS, m_SMin(m_Value(A), m_Value(B))) &&
|
|
|
|
(A == LHS || B == LHS)) {
|
|
|
|
if (A != LHS) std::swap(A, B); // A pred smin(A, B).
|
2012-09-27 10:14:43 +00:00
|
|
|
EqP = CmpInst::ICMP_SLE; // "A == smin(A, B)" iff "A sle B".
|
2011-05-03 19:53:10 +00:00
|
|
|
// We analyze this as smax(-A, -B) pred -A.
|
|
|
|
// Note that we do not need to actually form -A or -B thanks to EqP.
|
|
|
|
P = Pred;
|
|
|
|
}
|
|
|
|
if (P != CmpInst::BAD_ICMP_PREDICATE) {
|
|
|
|
// Cases correspond to "max(A, B) p A".
|
|
|
|
switch (P) {
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_EQ:
|
|
|
|
case CmpInst::ICMP_SLE:
|
2011-05-07 16:56:49 +00:00
|
|
|
// Equivalent to "A EqP B". This may be the same as the condition tested
|
|
|
|
// in the max/min; if so, we can just return that.
|
|
|
|
if (Value *V = ExtractEquivalentCondition(LHS, EqP, A, B))
|
|
|
|
return V;
|
|
|
|
if (Value *V = ExtractEquivalentCondition(RHS, EqP, A, B))
|
|
|
|
return V;
|
|
|
|
// Otherwise, see if "A EqP B" simplifies.
|
2011-05-03 19:53:10 +00:00
|
|
|
if (MaxRecurse)
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyICmpInst(EqP, A, B, Q, MaxRecurse-1))
|
2011-05-03 19:53:10 +00:00
|
|
|
return V;
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_NE:
|
2011-05-07 16:56:49 +00:00
|
|
|
case CmpInst::ICMP_SGT: {
|
|
|
|
CmpInst::Predicate InvEqP = CmpInst::getInversePredicate(EqP);
|
|
|
|
// Equivalent to "A InvEqP B". This may be the same as the condition
|
|
|
|
// tested in the max/min; if so, we can just return that.
|
|
|
|
if (Value *V = ExtractEquivalentCondition(LHS, InvEqP, A, B))
|
|
|
|
return V;
|
|
|
|
if (Value *V = ExtractEquivalentCondition(RHS, InvEqP, A, B))
|
|
|
|
return V;
|
|
|
|
// Otherwise, see if "A InvEqP B" simplifies.
|
2011-05-03 19:53:10 +00:00
|
|
|
if (MaxRecurse)
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyICmpInst(InvEqP, A, B, Q, MaxRecurse-1))
|
2011-05-03 19:53:10 +00:00
|
|
|
return V;
|
|
|
|
break;
|
2011-05-07 16:56:49 +00:00
|
|
|
}
|
2011-05-03 19:53:10 +00:00
|
|
|
case CmpInst::ICMP_SGE:
|
|
|
|
// Always true.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-05-03 19:53:10 +00:00
|
|
|
case CmpInst::ICMP_SLT:
|
|
|
|
// Always false.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-05-03 19:53:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-04 16:05:05 +00:00
|
|
|
// Unsigned variants on "max(a,b)>=a -> true".
|
2011-05-03 19:53:10 +00:00
|
|
|
P = CmpInst::BAD_ICMP_PREDICATE;
|
|
|
|
if (match(LHS, m_UMax(m_Value(A), m_Value(B))) && (A == RHS || B == RHS)) {
|
|
|
|
if (A != RHS) std::swap(A, B); // umax(A, B) pred A.
|
2012-09-27 10:14:43 +00:00
|
|
|
EqP = CmpInst::ICMP_UGE; // "A == umax(A, B)" iff "A uge B".
|
2011-05-03 19:53:10 +00:00
|
|
|
// We analyze this as umax(A, B) pred A.
|
|
|
|
P = Pred;
|
|
|
|
} else if (match(RHS, m_UMax(m_Value(A), m_Value(B))) &&
|
|
|
|
(A == LHS || B == LHS)) {
|
|
|
|
if (A != LHS) std::swap(A, B); // A pred umax(A, B).
|
2012-09-27 10:14:43 +00:00
|
|
|
EqP = CmpInst::ICMP_UGE; // "A == umax(A, B)" iff "A uge B".
|
2011-05-03 19:53:10 +00:00
|
|
|
// We analyze this as umax(A, B) swapped-pred A.
|
|
|
|
P = CmpInst::getSwappedPredicate(Pred);
|
|
|
|
} else if (match(LHS, m_UMin(m_Value(A), m_Value(B))) &&
|
|
|
|
(A == RHS || B == RHS)) {
|
|
|
|
if (A != RHS) std::swap(A, B); // umin(A, B) pred A.
|
2012-09-27 10:14:43 +00:00
|
|
|
EqP = CmpInst::ICMP_ULE; // "A == umin(A, B)" iff "A ule B".
|
2011-05-03 19:53:10 +00:00
|
|
|
// We analyze this as umax(-A, -B) swapped-pred -A.
|
|
|
|
// Note that we do not need to actually form -A or -B thanks to EqP.
|
|
|
|
P = CmpInst::getSwappedPredicate(Pred);
|
|
|
|
} else if (match(RHS, m_UMin(m_Value(A), m_Value(B))) &&
|
|
|
|
(A == LHS || B == LHS)) {
|
|
|
|
if (A != LHS) std::swap(A, B); // A pred umin(A, B).
|
2012-09-27 10:14:43 +00:00
|
|
|
EqP = CmpInst::ICMP_ULE; // "A == umin(A, B)" iff "A ule B".
|
2011-05-03 19:53:10 +00:00
|
|
|
// We analyze this as umax(-A, -B) pred -A.
|
|
|
|
// Note that we do not need to actually form -A or -B thanks to EqP.
|
|
|
|
P = Pred;
|
|
|
|
}
|
|
|
|
if (P != CmpInst::BAD_ICMP_PREDICATE) {
|
|
|
|
// Cases correspond to "max(A, B) p A".
|
|
|
|
switch (P) {
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_EQ:
|
|
|
|
case CmpInst::ICMP_ULE:
|
2011-05-07 16:56:49 +00:00
|
|
|
// Equivalent to "A EqP B". This may be the same as the condition tested
|
|
|
|
// in the max/min; if so, we can just return that.
|
|
|
|
if (Value *V = ExtractEquivalentCondition(LHS, EqP, A, B))
|
|
|
|
return V;
|
|
|
|
if (Value *V = ExtractEquivalentCondition(RHS, EqP, A, B))
|
|
|
|
return V;
|
|
|
|
// Otherwise, see if "A EqP B" simplifies.
|
2011-05-03 19:53:10 +00:00
|
|
|
if (MaxRecurse)
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyICmpInst(EqP, A, B, Q, MaxRecurse-1))
|
2011-05-03 19:53:10 +00:00
|
|
|
return V;
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_NE:
|
2011-05-07 16:56:49 +00:00
|
|
|
case CmpInst::ICMP_UGT: {
|
|
|
|
CmpInst::Predicate InvEqP = CmpInst::getInversePredicate(EqP);
|
|
|
|
// Equivalent to "A InvEqP B". This may be the same as the condition
|
|
|
|
// tested in the max/min; if so, we can just return that.
|
|
|
|
if (Value *V = ExtractEquivalentCondition(LHS, InvEqP, A, B))
|
|
|
|
return V;
|
|
|
|
if (Value *V = ExtractEquivalentCondition(RHS, InvEqP, A, B))
|
|
|
|
return V;
|
|
|
|
// Otherwise, see if "A InvEqP B" simplifies.
|
2011-05-03 19:53:10 +00:00
|
|
|
if (MaxRecurse)
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyICmpInst(InvEqP, A, B, Q, MaxRecurse-1))
|
2011-05-03 19:53:10 +00:00
|
|
|
return V;
|
|
|
|
break;
|
2011-05-07 16:56:49 +00:00
|
|
|
}
|
2011-05-03 19:53:10 +00:00
|
|
|
case CmpInst::ICMP_UGE:
|
|
|
|
// Always true.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-05-03 19:53:10 +00:00
|
|
|
case CmpInst::ICMP_ULT:
|
|
|
|
// Always false.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-05-03 19:53:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-04 16:05:05 +00:00
|
|
|
// Variants on "max(x,y) >= min(x,z)".
|
|
|
|
Value *C, *D;
|
|
|
|
if (match(LHS, m_SMax(m_Value(A), m_Value(B))) &&
|
|
|
|
match(RHS, m_SMin(m_Value(C), m_Value(D))) &&
|
|
|
|
(A == C || A == D || B == C || B == D)) {
|
|
|
|
// max(x, ?) pred min(x, ?).
|
|
|
|
if (Pred == CmpInst::ICMP_SGE)
|
|
|
|
// Always true.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-05-04 16:05:05 +00:00
|
|
|
if (Pred == CmpInst::ICMP_SLT)
|
|
|
|
// Always false.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-05-04 16:05:05 +00:00
|
|
|
} else if (match(LHS, m_SMin(m_Value(A), m_Value(B))) &&
|
|
|
|
match(RHS, m_SMax(m_Value(C), m_Value(D))) &&
|
|
|
|
(A == C || A == D || B == C || B == D)) {
|
|
|
|
// min(x, ?) pred max(x, ?).
|
|
|
|
if (Pred == CmpInst::ICMP_SLE)
|
|
|
|
// Always true.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-05-04 16:05:05 +00:00
|
|
|
if (Pred == CmpInst::ICMP_SGT)
|
|
|
|
// Always false.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-05-04 16:05:05 +00:00
|
|
|
} else if (match(LHS, m_UMax(m_Value(A), m_Value(B))) &&
|
|
|
|
match(RHS, m_UMin(m_Value(C), m_Value(D))) &&
|
|
|
|
(A == C || A == D || B == C || B == D)) {
|
|
|
|
// max(x, ?) pred min(x, ?).
|
|
|
|
if (Pred == CmpInst::ICMP_UGE)
|
|
|
|
// Always true.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-05-04 16:05:05 +00:00
|
|
|
if (Pred == CmpInst::ICMP_ULT)
|
|
|
|
// Always false.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-05-04 16:05:05 +00:00
|
|
|
} else if (match(LHS, m_UMin(m_Value(A), m_Value(B))) &&
|
|
|
|
match(RHS, m_UMax(m_Value(C), m_Value(D))) &&
|
|
|
|
(A == C || A == D || B == C || B == D)) {
|
|
|
|
// min(x, ?) pred max(x, ?).
|
|
|
|
if (Pred == CmpInst::ICMP_ULE)
|
|
|
|
// Always true.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getTrue(ITy);
|
2011-05-04 16:05:05 +00:00
|
|
|
if (Pred == CmpInst::ICMP_UGT)
|
|
|
|
// Always false.
|
2011-07-26 15:03:53 +00:00
|
|
|
return getFalse(ITy);
|
2011-05-04 16:05:05 +00:00
|
|
|
}
|
|
|
|
|
2012-03-25 21:28:14 +00:00
|
|
|
// Simplify comparisons of related pointers using a powerful, recursive
|
|
|
|
// GEP-walk when we have target data available..
|
2013-01-31 00:32:11 +00:00
|
|
|
if (Q.TD && LHS->getType()->isPointerTy())
|
2012-03-25 21:28:14 +00:00
|
|
|
if (Constant *C = computePointerICmp(*Q.TD, Pred, LHS, RHS))
|
|
|
|
return C;
|
|
|
|
|
2012-02-26 02:09:49 +00:00
|
|
|
if (GetElementPtrInst *GLHS = dyn_cast<GetElementPtrInst>(LHS)) {
|
|
|
|
if (GEPOperator *GRHS = dyn_cast<GEPOperator>(RHS)) {
|
|
|
|
if (GLHS->getPointerOperand() == GRHS->getPointerOperand() &&
|
|
|
|
GLHS->hasAllConstantIndices() && GRHS->hasAllConstantIndices() &&
|
|
|
|
(ICmpInst::isEquality(Pred) ||
|
|
|
|
(GLHS->isInBounds() && GRHS->isInBounds() &&
|
|
|
|
Pred == ICmpInst::getSignedPredicate(Pred)))) {
|
|
|
|
// The bases are equal and the indices are constant. Build a constant
|
|
|
|
// expression GEP with the same indices and a null base pointer to see
|
|
|
|
// what constant folding can make out of it.
|
|
|
|
Constant *Null = Constant::getNullValue(GLHS->getPointerOperandType());
|
|
|
|
SmallVector<Value *, 4> IndicesLHS(GLHS->idx_begin(), GLHS->idx_end());
|
|
|
|
Constant *NewLHS = ConstantExpr::getGetElementPtr(Null, IndicesLHS);
|
|
|
|
|
|
|
|
SmallVector<Value *, 4> IndicesRHS(GRHS->idx_begin(), GRHS->idx_end());
|
|
|
|
Constant *NewRHS = ConstantExpr::getGetElementPtr(Null, IndicesRHS);
|
|
|
|
return ConstantExpr::getICmp(Pred, NewLHS, NewRHS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-11-07 16:12:23 +00:00
|
|
|
// If the comparison is with the result of a select instruction, check whether
|
|
|
|
// comparing with either branch of the select always yields the same value.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<SelectInst>(LHS) || isa<SelectInst>(RHS))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadCmpOverSelect(Pred, LHS, RHS, Q, MaxRecurse))
|
2010-11-10 18:23:01 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the comparison is with the result of a phi instruction, check whether
|
|
|
|
// doing the compare with each incoming phi value yields a common result.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<PHINode>(LHS) || isa<PHINode>(RHS))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadCmpOverPHI(Pred, LHS, RHS, Q, MaxRecurse))
|
2010-11-09 17:25:51 +00:00
|
|
|
return V;
|
2010-11-07 16:12:23 +00:00
|
|
|
|
2009-11-09 23:28:39 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-11-10 18:23:01 +00:00
|
|
|
Value *llvm::SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyICmpInst(Predicate, LHS, RHS, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
2010-11-10 18:23:01 +00:00
|
|
|
}
|
|
|
|
|
2009-11-09 23:28:39 +00:00
|
|
|
/// SimplifyFCmpInst - Given operands for an FCmpInst, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2010-11-10 18:23:01 +00:00
|
|
|
static Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2009-11-09 23:28:39 +00:00
|
|
|
CmpInst::Predicate Pred = (CmpInst::Predicate)Predicate;
|
|
|
|
assert(CmpInst::isFPPredicate(Pred) && "Not an FP compare!");
|
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(LHS)) {
|
2009-11-09 23:28:39 +00:00
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(RHS))
|
2012-03-13 11:42:19 +00:00
|
|
|
return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, Q.TD, Q.TLI);
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
// If we have a constant, make sure it is on the RHS.
|
|
|
|
std::swap(LHS, RHS);
|
|
|
|
Pred = CmpInst::getSwappedPredicate(Pred);
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-09 23:55:12 +00:00
|
|
|
// Fold trivial predicates.
|
|
|
|
if (Pred == FCmpInst::FCMP_FALSE)
|
|
|
|
return ConstantInt::get(GetCompareTy(LHS), 0);
|
|
|
|
if (Pred == FCmpInst::FCMP_TRUE)
|
|
|
|
return ConstantInt::get(GetCompareTy(LHS), 1);
|
|
|
|
|
|
|
|
if (isa<UndefValue>(RHS)) // fcmp pred X, undef -> undef
|
|
|
|
return UndefValue::get(GetCompareTy(LHS));
|
|
|
|
|
|
|
|
// fcmp x,x -> true/false. Not all compares are foldable.
|
2011-01-01 20:08:02 +00:00
|
|
|
if (LHS == RHS) {
|
2009-11-09 23:55:12 +00:00
|
|
|
if (CmpInst::isTrueWhenEqual(Pred))
|
|
|
|
return ConstantInt::get(GetCompareTy(LHS), 1);
|
|
|
|
if (CmpInst::isFalseWhenEqual(Pred))
|
|
|
|
return ConstantInt::get(GetCompareTy(LHS), 0);
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-09 23:55:12 +00:00
|
|
|
// Handle fcmp with constant RHS
|
|
|
|
if (Constant *RHSC = dyn_cast<Constant>(RHS)) {
|
|
|
|
// If the constant is a nan, see if we can fold the comparison based on it.
|
|
|
|
if (ConstantFP *CFP = dyn_cast<ConstantFP>(RHSC)) {
|
|
|
|
if (CFP->getValueAPF().isNaN()) {
|
|
|
|
if (FCmpInst::isOrdered(Pred)) // True "if ordered and foo"
|
|
|
|
return ConstantInt::getFalse(CFP->getContext());
|
|
|
|
assert(FCmpInst::isUnordered(Pred) &&
|
|
|
|
"Comparison must be either ordered or unordered!");
|
|
|
|
// True if unordered.
|
|
|
|
return ConstantInt::getTrue(CFP->getContext());
|
|
|
|
}
|
2010-02-22 04:06:03 +00:00
|
|
|
// Check whether the constant is an infinity.
|
|
|
|
if (CFP->getValueAPF().isInfinity()) {
|
|
|
|
if (CFP->getValueAPF().isNegative()) {
|
|
|
|
switch (Pred) {
|
|
|
|
case FCmpInst::FCMP_OLT:
|
|
|
|
// No value is ordered and less than negative infinity.
|
|
|
|
return ConstantInt::getFalse(CFP->getContext());
|
|
|
|
case FCmpInst::FCMP_UGE:
|
|
|
|
// All values are unordered with or at least negative infinity.
|
|
|
|
return ConstantInt::getTrue(CFP->getContext());
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
switch (Pred) {
|
|
|
|
case FCmpInst::FCMP_OGT:
|
|
|
|
// No value is ordered and greater than infinity.
|
|
|
|
return ConstantInt::getFalse(CFP->getContext());
|
|
|
|
case FCmpInst::FCMP_ULE:
|
|
|
|
// All values are unordered with and at most infinity.
|
|
|
|
return ConstantInt::getTrue(CFP->getContext());
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-11-09 23:55:12 +00:00
|
|
|
}
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-11-07 16:46:25 +00:00
|
|
|
// If the comparison is with the result of a select instruction, check whether
|
|
|
|
// comparing with either branch of the select always yields the same value.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<SelectInst>(LHS) || isa<SelectInst>(RHS))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadCmpOverSelect(Pred, LHS, RHS, Q, MaxRecurse))
|
2010-11-10 18:23:01 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the comparison is with the result of a phi instruction, check whether
|
|
|
|
// doing the compare with each incoming phi value yields a common result.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<PHINode>(LHS) || isa<PHINode>(RHS))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadCmpOverPHI(Pred, LHS, RHS, Q, MaxRecurse))
|
2010-11-09 17:25:51 +00:00
|
|
|
return V;
|
2010-11-07 16:46:25 +00:00
|
|
|
|
2009-11-09 22:57:59 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-11-10 18:23:01 +00:00
|
|
|
Value *llvm::SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyFCmpInst(Predicate, LHS, RHS, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
2010-11-10 18:23:01 +00:00
|
|
|
}
|
|
|
|
|
2010-04-20 05:32:14 +00:00
|
|
|
/// SimplifySelectInst - Given operands for a SelectInst, see if we can fold
|
|
|
|
/// the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifySelectInst(Value *CondVal, Value *TrueVal,
|
|
|
|
Value *FalseVal, const Query &Q,
|
|
|
|
unsigned MaxRecurse) {
|
2010-04-20 05:32:14 +00:00
|
|
|
// select true, X, Y -> X
|
|
|
|
// select false, X, Y -> Y
|
|
|
|
if (ConstantInt *CB = dyn_cast<ConstantInt>(CondVal))
|
|
|
|
return CB->getZExtValue() ? TrueVal : FalseVal;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-04-20 05:32:14 +00:00
|
|
|
// select C, X, X -> X
|
2011-01-01 20:08:02 +00:00
|
|
|
if (TrueVal == FalseVal)
|
2010-04-20 05:32:14 +00:00
|
|
|
return TrueVal;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-04-20 05:32:14 +00:00
|
|
|
if (isa<UndefValue>(CondVal)) { // select undef, X, Y -> X or Y
|
|
|
|
if (isa<Constant>(TrueVal))
|
|
|
|
return TrueVal;
|
|
|
|
return FalseVal;
|
|
|
|
}
|
2011-07-01 01:03:43 +00:00
|
|
|
if (isa<UndefValue>(TrueVal)) // select C, undef, X -> X
|
|
|
|
return FalseVal;
|
|
|
|
if (isa<UndefValue>(FalseVal)) // select C, X, undef -> X
|
|
|
|
return TrueVal;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2010-04-20 05:32:14 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-03-13 11:42:19 +00:00
|
|
|
Value *llvm::SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2012-03-13 11:42:19 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
return ::SimplifySelectInst(Cond, TrueVal, FalseVal, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
|
|
|
}
|
|
|
|
|
2009-11-27 00:29:05 +00:00
|
|
|
/// SimplifyGEPInst - Given operands for an GetElementPtrInst, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyGEPInst(ArrayRef<Value *> Ops, const Query &Q, unsigned) {
|
2010-11-22 13:42:49 +00:00
|
|
|
// The type of the GEP pointer operand.
|
2011-12-05 06:29:09 +00:00
|
|
|
PointerType *PtrTy = dyn_cast<PointerType>(Ops[0]->getType());
|
|
|
|
// The GEP pointer operand is not a pointer, it's a vector of pointers.
|
|
|
|
if (!PtrTy)
|
|
|
|
return 0;
|
2010-11-22 13:42:49 +00:00
|
|
|
|
2009-11-27 00:29:05 +00:00
|
|
|
// getelementptr P -> P.
|
2011-07-19 15:07:52 +00:00
|
|
|
if (Ops.size() == 1)
|
2009-11-27 00:29:05 +00:00
|
|
|
return Ops[0];
|
|
|
|
|
2010-11-22 13:42:49 +00:00
|
|
|
if (isa<UndefValue>(Ops[0])) {
|
|
|
|
// Compute the (pointer) type returned by the GEP instruction.
|
2011-07-25 09:48:08 +00:00
|
|
|
Type *LastType = GetElementPtrInst::getIndexedType(PtrTy, Ops.slice(1));
|
2011-07-18 04:54:35 +00:00
|
|
|
Type *GEPTy = PointerType::get(LastType, PtrTy->getAddressSpace());
|
2010-11-22 13:42:49 +00:00
|
|
|
return UndefValue::get(GEPTy);
|
|
|
|
}
|
2009-11-27 00:29:05 +00:00
|
|
|
|
2011-07-19 15:07:52 +00:00
|
|
|
if (Ops.size() == 2) {
|
2010-11-21 13:53:09 +00:00
|
|
|
// getelementptr P, 0 -> P.
|
2009-11-27 00:29:05 +00:00
|
|
|
if (ConstantInt *C = dyn_cast<ConstantInt>(Ops[1]))
|
|
|
|
if (C->isZero())
|
|
|
|
return Ops[0];
|
2010-11-21 13:53:09 +00:00
|
|
|
// getelementptr P, N -> P if P points to a type of zero size.
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Q.TD) {
|
2011-07-18 04:54:35 +00:00
|
|
|
Type *Ty = PtrTy->getElementType();
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Ty->isSized() && Q.TD->getTypeAllocSize(Ty) == 0)
|
2010-11-21 13:53:09 +00:00
|
|
|
return Ops[0];
|
|
|
|
}
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2009-11-27 00:29:05 +00:00
|
|
|
// Check to see if this is constant foldable.
|
2011-07-19 15:07:52 +00:00
|
|
|
for (unsigned i = 0, e = Ops.size(); i != e; ++i)
|
2009-11-27 00:29:05 +00:00
|
|
|
if (!isa<Constant>(Ops[i]))
|
|
|
|
return 0;
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2011-07-21 14:31:17 +00:00
|
|
|
return ConstantExpr::getGetElementPtr(cast<Constant>(Ops[0]), Ops.slice(1));
|
2009-11-27 00:29:05 +00:00
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyGEPInst(ArrayRef<Value *> Ops, const DataLayout *TD,
|
2012-03-13 11:42:19 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
return ::SimplifyGEPInst(Ops, Query (TD, TLI, DT), RecursionLimit);
|
|
|
|
}
|
|
|
|
|
2011-09-05 06:52:48 +00:00
|
|
|
/// SimplifyInsertValueInst - Given operands for an InsertValueInst, see if we
|
|
|
|
/// can fold the result. If not, this returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyInsertValueInst(Value *Agg, Value *Val,
|
|
|
|
ArrayRef<unsigned> Idxs, const Query &Q,
|
|
|
|
unsigned) {
|
2011-09-05 06:52:48 +00:00
|
|
|
if (Constant *CAgg = dyn_cast<Constant>(Agg))
|
|
|
|
if (Constant *CVal = dyn_cast<Constant>(Val))
|
|
|
|
return ConstantFoldInsertValueInstruction(CAgg, CVal, Idxs);
|
|
|
|
|
|
|
|
// insertvalue x, undef, n -> x
|
|
|
|
if (match(Val, m_Undef()))
|
|
|
|
return Agg;
|
|
|
|
|
|
|
|
// insertvalue x, (extractvalue y, n), n
|
|
|
|
if (ExtractValueInst *EV = dyn_cast<ExtractValueInst>(Val))
|
2011-09-05 18:16:19 +00:00
|
|
|
if (EV->getAggregateOperand()->getType() == Agg->getType() &&
|
|
|
|
EV->getIndices() == Idxs) {
|
2011-09-05 06:52:48 +00:00
|
|
|
// insertvalue undef, (extractvalue y, n), n -> y
|
|
|
|
if (match(Agg, m_Undef()))
|
|
|
|
return EV->getAggregateOperand();
|
|
|
|
|
|
|
|
// insertvalue y, (extractvalue y, n), n -> y
|
|
|
|
if (Agg == EV->getAggregateOperand())
|
|
|
|
return Agg;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-03-13 11:42:19 +00:00
|
|
|
Value *llvm::SimplifyInsertValueInst(Value *Agg, Value *Val,
|
|
|
|
ArrayRef<unsigned> Idxs,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2012-03-13 11:42:19 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
return ::SimplifyInsertValueInst(Agg, Val, Idxs, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
|
|
|
}
|
|
|
|
|
2010-11-17 04:30:22 +00:00
|
|
|
/// SimplifyPHINode - See if we can fold the given phi. If not, returns null.
|
2012-03-13 11:42:19 +00:00
|
|
|
static Value *SimplifyPHINode(PHINode *PN, const Query &Q) {
|
2010-11-17 04:30:22 +00:00
|
|
|
// If all of the PHI's incoming values are the same then replace the PHI node
|
|
|
|
// with the common value.
|
|
|
|
Value *CommonValue = 0;
|
|
|
|
bool HasUndefInput = false;
|
|
|
|
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
|
|
|
Value *Incoming = PN->getIncomingValue(i);
|
|
|
|
// If the incoming value is the phi node itself, it can safely be skipped.
|
|
|
|
if (Incoming == PN) continue;
|
|
|
|
if (isa<UndefValue>(Incoming)) {
|
|
|
|
// Remember that we saw an undef value, but otherwise ignore them.
|
|
|
|
HasUndefInput = true;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (CommonValue && Incoming != CommonValue)
|
|
|
|
return 0; // Not the same, bail out.
|
|
|
|
CommonValue = Incoming;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If CommonValue is null then all of the incoming values were either undef or
|
|
|
|
// equal to the phi node itself.
|
|
|
|
if (!CommonValue)
|
|
|
|
return UndefValue::get(PN->getType());
|
|
|
|
|
|
|
|
// If we have a PHI node like phi(X, undef, X), where X is defined by some
|
|
|
|
// instruction, we cannot return X as the result of the PHI node unless it
|
|
|
|
// dominates the PHI block.
|
|
|
|
if (HasUndefInput)
|
2012-03-13 11:42:19 +00:00
|
|
|
return ValueDominatesPHI(CommonValue, PN, Q.DT) ? CommonValue : 0;
|
2010-11-17 04:30:22 +00:00
|
|
|
|
|
|
|
return CommonValue;
|
|
|
|
}
|
|
|
|
|
2012-03-13 14:07:05 +00:00
|
|
|
static Value *SimplifyTruncInst(Value *Op, Type *Ty, const Query &Q, unsigned) {
|
|
|
|
if (Constant *C = dyn_cast<Constant>(Op))
|
|
|
|
return ConstantFoldInstOperands(Instruction::Trunc, Ty, C, Q.TD, Q.TLI);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyTruncInst(Value *Op, Type *Ty, const DataLayout *TD,
|
2012-03-13 14:07:05 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
return ::SimplifyTruncInst(Op, Ty, Query (TD, TLI, DT), RecursionLimit);
|
|
|
|
}
|
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
//=== Helper functions for higher up the class hierarchy.
|
2009-11-09 23:28:39 +00:00
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
/// SimplifyBinOp - Given operands for a BinaryOperator, see if we can
|
|
|
|
/// fold the result. If not, this returns null.
|
2010-11-10 18:23:01 +00:00
|
|
|
static Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2009-11-10 00:55:12 +00:00
|
|
|
switch (Opcode) {
|
2011-02-09 17:15:04 +00:00
|
|
|
case Instruction::Add:
|
2011-02-09 17:45:03 +00:00
|
|
|
return SimplifyAddInst(LHS, RHS, /*isNSW*/false, /*isNUW*/false,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse);
|
2012-12-12 00:29:16 +00:00
|
|
|
case Instruction::FAdd:
|
|
|
|
return SimplifyFAddInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
|
|
|
|
|
2011-02-09 17:15:04 +00:00
|
|
|
case Instruction::Sub:
|
2011-02-09 17:45:03 +00:00
|
|
|
return SimplifySubInst(LHS, RHS, /*isNSW*/false, /*isNUW*/false,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse);
|
2012-12-12 00:29:16 +00:00
|
|
|
case Instruction::FSub:
|
|
|
|
return SimplifyFSubInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
|
|
|
|
|
2012-03-13 11:42:19 +00:00
|
|
|
case Instruction::Mul: return SimplifyMulInst (LHS, RHS, Q, MaxRecurse);
|
2012-12-12 00:29:16 +00:00
|
|
|
case Instruction::FMul:
|
|
|
|
return SimplifyFMulInst (LHS, RHS, FastMathFlags(), Q, MaxRecurse);
|
2012-03-13 11:42:19 +00:00
|
|
|
case Instruction::SDiv: return SimplifySDivInst(LHS, RHS, Q, MaxRecurse);
|
|
|
|
case Instruction::UDiv: return SimplifyUDivInst(LHS, RHS, Q, MaxRecurse);
|
|
|
|
case Instruction::FDiv: return SimplifyFDivInst(LHS, RHS, Q, MaxRecurse);
|
|
|
|
case Instruction::SRem: return SimplifySRemInst(LHS, RHS, Q, MaxRecurse);
|
|
|
|
case Instruction::URem: return SimplifyURemInst(LHS, RHS, Q, MaxRecurse);
|
|
|
|
case Instruction::FRem: return SimplifyFRemInst(LHS, RHS, Q, MaxRecurse);
|
2011-02-09 17:15:04 +00:00
|
|
|
case Instruction::Shl:
|
2011-02-09 17:45:03 +00:00
|
|
|
return SimplifyShlInst(LHS, RHS, /*isNSW*/false, /*isNUW*/false,
|
2012-03-13 11:42:19 +00:00
|
|
|
Q, MaxRecurse);
|
2011-02-09 17:15:04 +00:00
|
|
|
case Instruction::LShr:
|
2012-03-13 11:42:19 +00:00
|
|
|
return SimplifyLShrInst(LHS, RHS, /*isExact*/false, Q, MaxRecurse);
|
2011-02-09 17:15:04 +00:00
|
|
|
case Instruction::AShr:
|
2012-03-13 11:42:19 +00:00
|
|
|
return SimplifyAShrInst(LHS, RHS, /*isExact*/false, Q, MaxRecurse);
|
|
|
|
case Instruction::And: return SimplifyAndInst(LHS, RHS, Q, MaxRecurse);
|
|
|
|
case Instruction::Or: return SimplifyOrInst (LHS, RHS, Q, MaxRecurse);
|
|
|
|
case Instruction::Xor: return SimplifyXorInst(LHS, RHS, Q, MaxRecurse);
|
2009-11-10 00:55:12 +00:00
|
|
|
default:
|
|
|
|
if (Constant *CLHS = dyn_cast<Constant>(LHS))
|
|
|
|
if (Constant *CRHS = dyn_cast<Constant>(RHS)) {
|
|
|
|
Constant *COps[] = {CLHS, CRHS};
|
2012-03-13 11:42:19 +00:00
|
|
|
return ConstantFoldInstOperands(Opcode, LHS->getType(), COps, Q.TD,
|
|
|
|
Q.TLI);
|
2009-11-10 00:55:12 +00:00
|
|
|
}
|
2010-11-10 13:00:08 +00:00
|
|
|
|
2010-12-21 08:49:00 +00:00
|
|
|
// If the operation is associative, try some generic simplifications.
|
|
|
|
if (Instruction::isAssociative(Opcode))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = SimplifyAssociativeBinOp(Opcode, LHS, RHS, Q, MaxRecurse))
|
2010-12-21 08:49:00 +00:00
|
|
|
return V;
|
|
|
|
|
2012-03-13 11:42:19 +00:00
|
|
|
// If the operation is with the result of a select instruction check whether
|
2010-11-10 13:00:08 +00:00
|
|
|
// operating on either branch of the select always yields the same value.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<SelectInst>(LHS) || isa<SelectInst>(RHS))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverSelect(Opcode, LHS, RHS, Q, MaxRecurse))
|
2010-11-10 18:23:01 +00:00
|
|
|
return V;
|
|
|
|
|
|
|
|
// If the operation is with the result of a phi instruction, check whether
|
|
|
|
// operating on all incoming values of the phi always yields the same value.
|
2010-12-21 09:09:15 +00:00
|
|
|
if (isa<PHINode>(LHS) || isa<PHINode>(RHS))
|
2012-03-13 11:42:19 +00:00
|
|
|
if (Value *V = ThreadBinOpOverPHI(Opcode, LHS, RHS, Q, MaxRecurse))
|
2010-11-10 13:00:08 +00:00
|
|
|
return V;
|
|
|
|
|
2009-11-10 00:55:12 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2009-11-09 23:28:39 +00:00
|
|
|
|
2010-11-14 11:23:23 +00:00
|
|
|
Value *llvm::SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
2011-12-01 03:08:23 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyBinOp(Opcode, LHS, RHS, Query (TD, TLI, DT), RecursionLimit);
|
2010-11-10 18:23:01 +00:00
|
|
|
}
|
|
|
|
|
2009-11-09 23:28:39 +00:00
|
|
|
/// SimplifyCmpInst - Given operands for a CmpInst, see if we can
|
|
|
|
/// fold the result.
|
2010-11-10 18:23:01 +00:00
|
|
|
static Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
2012-03-13 11:42:19 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2009-11-09 23:28:39 +00:00
|
|
|
if (CmpInst::isIntPredicate((CmpInst::Predicate)Predicate))
|
2012-03-13 11:42:19 +00:00
|
|
|
return SimplifyICmpInst(Predicate, LHS, RHS, Q, MaxRecurse);
|
|
|
|
return SimplifyFCmpInst(Predicate, LHS, RHS, Q, MaxRecurse);
|
2009-11-09 23:28:39 +00:00
|
|
|
}
|
|
|
|
|
2010-11-10 18:23:01 +00:00
|
|
|
Value *llvm::SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
2011-12-01 03:08:23 +00:00
|
|
|
const DominatorTree *DT) {
|
2012-03-13 11:42:19 +00:00
|
|
|
return ::SimplifyCmpInst(Predicate, LHS, RHS, Query (TD, TLI, DT),
|
|
|
|
RecursionLimit);
|
2010-11-10 18:23:01 +00:00
|
|
|
}
|
2009-11-10 01:08:51 +00:00
|
|
|
|
2012-12-28 14:23:29 +00:00
|
|
|
template <typename IterTy>
|
|
|
|
static Value *SimplifyCall(Value *V, IterTy ArgBegin, IterTy ArgEnd,
|
2012-12-28 11:30:55 +00:00
|
|
|
const Query &Q, unsigned MaxRecurse) {
|
2012-12-28 14:23:29 +00:00
|
|
|
Type *Ty = V->getType();
|
2012-12-28 11:30:55 +00:00
|
|
|
if (PointerType *PTy = dyn_cast<PointerType>(Ty))
|
|
|
|
Ty = PTy->getElementType();
|
|
|
|
FunctionType *FTy = cast<FunctionType>(Ty);
|
|
|
|
|
2011-11-04 18:32:42 +00:00
|
|
|
// call undef -> undef
|
2012-12-28 14:23:29 +00:00
|
|
|
if (isa<UndefValue>(V))
|
2012-12-28 11:30:55 +00:00
|
|
|
return UndefValue::get(FTy->getReturnType());
|
2011-11-04 18:32:42 +00:00
|
|
|
|
2012-12-28 14:23:29 +00:00
|
|
|
Function *F = dyn_cast<Function>(V);
|
|
|
|
if (!F)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (!canConstantFoldCallTo(F))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
SmallVector<Constant *, 4> ConstantArgs;
|
|
|
|
ConstantArgs.reserve(ArgEnd - ArgBegin);
|
|
|
|
for (IterTy I = ArgBegin, E = ArgEnd; I != E; ++I) {
|
|
|
|
Constant *C = dyn_cast<Constant>(*I);
|
|
|
|
if (!C)
|
|
|
|
return 0;
|
|
|
|
ConstantArgs.push_back(C);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ConstantFoldCall(F, ConstantArgs, Q.TLI);
|
2011-11-04 18:32:42 +00:00
|
|
|
}
|
|
|
|
|
2012-12-28 14:23:29 +00:00
|
|
|
Value *llvm::SimplifyCall(Value *V, User::op_iterator ArgBegin,
|
2012-12-28 11:30:55 +00:00
|
|
|
User::op_iterator ArgEnd, const DataLayout *TD,
|
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
2012-12-28 14:23:29 +00:00
|
|
|
return ::SimplifyCall(V, ArgBegin, ArgEnd, Query(TD, TLI, DT),
|
2012-12-28 11:30:55 +00:00
|
|
|
RecursionLimit);
|
|
|
|
}
|
|
|
|
|
2012-12-28 14:23:29 +00:00
|
|
|
Value *llvm::SimplifyCall(Value *V, ArrayRef<Value *> Args,
|
2012-12-28 11:30:55 +00:00
|
|
|
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
2012-12-28 14:23:29 +00:00
|
|
|
return ::SimplifyCall(V, Args.begin(), Args.end(), Query(TD, TLI, DT),
|
2012-12-28 11:30:55 +00:00
|
|
|
RecursionLimit);
|
|
|
|
}
|
|
|
|
|
2009-11-10 01:08:51 +00:00
|
|
|
/// SimplifyInstruction - See if we can compute a simplified version of this
|
|
|
|
/// instruction. If not, this returns null.
|
2012-10-08 16:38:25 +00:00
|
|
|
Value *llvm::SimplifyInstruction(Instruction *I, const DataLayout *TD,
|
2011-12-01 03:08:23 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
2010-11-14 18:36:10 +00:00
|
|
|
const DominatorTree *DT) {
|
2010-11-17 08:35:29 +00:00
|
|
|
Value *Result;
|
|
|
|
|
2009-11-10 01:08:51 +00:00
|
|
|
switch (I->getOpcode()) {
|
|
|
|
default:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = ConstantFoldInstruction(I, TD, TLI);
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
Added a slew of SimplifyInstruction floating-point optimizations, many of which take advantage of fast-math flags. Test cases included.
fsub X, +0 ==> X
fsub X, -0 ==> X, when we know X is not -0
fsub +/-0.0, (fsub -0.0, X) ==> X
fsub nsz +/-0.0, (fsub +/-0.0, X) ==> X
fsub nnan ninf X, X ==> 0.0
fadd nsz X, 0 ==> X
fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
where nnan and ninf have to occur at least once somewhere in this expression
fmul X, 1.0 ==> X
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169940 91177308-0d34-0410-b5e6-96231b3b80d8
2012-12-12 00:27:46 +00:00
|
|
|
case Instruction::FAdd:
|
|
|
|
Result = SimplifyFAddInst(I->getOperand(0), I->getOperand(1),
|
|
|
|
I->getFastMathFlags(), TD, TLI, DT);
|
|
|
|
break;
|
2009-11-27 17:42:22 +00:00
|
|
|
case Instruction::Add:
|
2010-11-17 08:35:29 +00:00
|
|
|
Result = SimplifyAddInst(I->getOperand(0), I->getOperand(1),
|
|
|
|
cast<BinaryOperator>(I)->hasNoSignedWrap(),
|
|
|
|
cast<BinaryOperator>(I)->hasNoUnsignedWrap(),
|
2011-12-01 03:08:23 +00:00
|
|
|
TD, TLI, DT);
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
Added a slew of SimplifyInstruction floating-point optimizations, many of which take advantage of fast-math flags. Test cases included.
fsub X, +0 ==> X
fsub X, -0 ==> X, when we know X is not -0
fsub +/-0.0, (fsub -0.0, X) ==> X
fsub nsz +/-0.0, (fsub +/-0.0, X) ==> X
fsub nnan ninf X, X ==> 0.0
fadd nsz X, 0 ==> X
fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
where nnan and ninf have to occur at least once somewhere in this expression
fmul X, 1.0 ==> X
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169940 91177308-0d34-0410-b5e6-96231b3b80d8
2012-12-12 00:27:46 +00:00
|
|
|
case Instruction::FSub:
|
|
|
|
Result = SimplifyFSubInst(I->getOperand(0), I->getOperand(1),
|
|
|
|
I->getFastMathFlags(), TD, TLI, DT);
|
|
|
|
break;
|
2010-12-15 14:07:39 +00:00
|
|
|
case Instruction::Sub:
|
|
|
|
Result = SimplifySubInst(I->getOperand(0), I->getOperand(1),
|
|
|
|
cast<BinaryOperator>(I)->hasNoSignedWrap(),
|
|
|
|
cast<BinaryOperator>(I)->hasNoUnsignedWrap(),
|
2011-12-01 03:08:23 +00:00
|
|
|
TD, TLI, DT);
|
2010-12-15 14:07:39 +00:00
|
|
|
break;
|
2012-11-27 00:46:26 +00:00
|
|
|
case Instruction::FMul:
|
|
|
|
Result = SimplifyFMulInst(I->getOperand(0), I->getOperand(1),
|
|
|
|
I->getFastMathFlags(), TD, TLI, DT);
|
|
|
|
break;
|
2010-12-21 14:00:22 +00:00
|
|
|
case Instruction::Mul:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifyMulInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2010-12-21 14:00:22 +00:00
|
|
|
break;
|
2011-01-28 16:51:11 +00:00
|
|
|
case Instruction::SDiv:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifySDivInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2011-01-28 16:51:11 +00:00
|
|
|
break;
|
|
|
|
case Instruction::UDiv:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifyUDivInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2011-01-28 16:51:11 +00:00
|
|
|
break;
|
2011-01-29 15:26:31 +00:00
|
|
|
case Instruction::FDiv:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifyFDivInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2011-01-29 15:26:31 +00:00
|
|
|
break;
|
2011-05-02 16:27:02 +00:00
|
|
|
case Instruction::SRem:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifySRemInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2011-05-02 16:27:02 +00:00
|
|
|
break;
|
|
|
|
case Instruction::URem:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifyURemInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2011-05-02 16:27:02 +00:00
|
|
|
break;
|
|
|
|
case Instruction::FRem:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifyFRemInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2011-05-02 16:27:02 +00:00
|
|
|
break;
|
2011-01-14 00:37:45 +00:00
|
|
|
case Instruction::Shl:
|
2011-02-09 17:15:04 +00:00
|
|
|
Result = SimplifyShlInst(I->getOperand(0), I->getOperand(1),
|
|
|
|
cast<BinaryOperator>(I)->hasNoSignedWrap(),
|
|
|
|
cast<BinaryOperator>(I)->hasNoUnsignedWrap(),
|
2011-12-01 03:08:23 +00:00
|
|
|
TD, TLI, DT);
|
2011-01-14 00:37:45 +00:00
|
|
|
break;
|
|
|
|
case Instruction::LShr:
|
2011-02-09 17:15:04 +00:00
|
|
|
Result = SimplifyLShrInst(I->getOperand(0), I->getOperand(1),
|
|
|
|
cast<BinaryOperator>(I)->isExact(),
|
2011-12-01 03:08:23 +00:00
|
|
|
TD, TLI, DT);
|
2011-01-14 00:37:45 +00:00
|
|
|
break;
|
|
|
|
case Instruction::AShr:
|
2011-02-09 17:15:04 +00:00
|
|
|
Result = SimplifyAShrInst(I->getOperand(0), I->getOperand(1),
|
|
|
|
cast<BinaryOperator>(I)->isExact(),
|
2011-12-01 03:08:23 +00:00
|
|
|
TD, TLI, DT);
|
2011-01-14 00:37:45 +00:00
|
|
|
break;
|
2009-11-10 01:08:51 +00:00
|
|
|
case Instruction::And:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
2009-11-10 01:08:51 +00:00
|
|
|
case Instruction::Or:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
2010-11-17 18:52:15 +00:00
|
|
|
case Instruction::Xor:
|
2011-12-01 03:08:23 +00:00
|
|
|
Result = SimplifyXorInst(I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2010-11-17 18:52:15 +00:00
|
|
|
break;
|
2009-11-10 01:08:51 +00:00
|
|
|
case Instruction::ICmp:
|
2010-11-17 08:35:29 +00:00
|
|
|
Result = SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
|
2011-12-01 03:08:23 +00:00
|
|
|
I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
2009-11-10 01:08:51 +00:00
|
|
|
case Instruction::FCmp:
|
2010-11-17 08:35:29 +00:00
|
|
|
Result = SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
|
2011-12-01 03:08:23 +00:00
|
|
|
I->getOperand(0), I->getOperand(1), TD, TLI, DT);
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
2010-04-20 05:32:14 +00:00
|
|
|
case Instruction::Select:
|
2010-11-17 08:35:29 +00:00
|
|
|
Result = SimplifySelectInst(I->getOperand(0), I->getOperand(1),
|
2012-03-13 11:42:19 +00:00
|
|
|
I->getOperand(2), TD, TLI, DT);
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
2009-11-27 00:29:05 +00:00
|
|
|
case Instruction::GetElementPtr: {
|
|
|
|
SmallVector<Value*, 8> Ops(I->op_begin(), I->op_end());
|
2012-03-13 11:42:19 +00:00
|
|
|
Result = SimplifyGEPInst(Ops, TD, TLI, DT);
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
2009-11-27 00:29:05 +00:00
|
|
|
}
|
2011-09-05 06:52:48 +00:00
|
|
|
case Instruction::InsertValue: {
|
|
|
|
InsertValueInst *IV = cast<InsertValueInst>(I);
|
|
|
|
Result = SimplifyInsertValueInst(IV->getAggregateOperand(),
|
|
|
|
IV->getInsertedValueOperand(),
|
2012-03-13 11:42:19 +00:00
|
|
|
IV->getIndices(), TD, TLI, DT);
|
2011-09-05 06:52:48 +00:00
|
|
|
break;
|
|
|
|
}
|
2010-11-14 13:30:18 +00:00
|
|
|
case Instruction::PHI:
|
2012-03-13 11:42:19 +00:00
|
|
|
Result = SimplifyPHINode(cast<PHINode>(I), Query (TD, TLI, DT));
|
2010-11-17 08:35:29 +00:00
|
|
|
break;
|
2012-12-28 11:30:55 +00:00
|
|
|
case Instruction::Call: {
|
|
|
|
CallSite CS(cast<CallInst>(I));
|
|
|
|
Result = SimplifyCall(CS.getCalledValue(), CS.arg_begin(), CS.arg_end(),
|
|
|
|
TD, TLI, DT);
|
2011-11-04 18:32:42 +00:00
|
|
|
break;
|
2012-12-28 11:30:55 +00:00
|
|
|
}
|
2012-03-13 14:07:05 +00:00
|
|
|
case Instruction::Trunc:
|
|
|
|
Result = SimplifyTruncInst(I->getOperand(0), I->getType(), TD, TLI, DT);
|
|
|
|
break;
|
2009-11-10 01:08:51 +00:00
|
|
|
}
|
2010-11-17 08:35:29 +00:00
|
|
|
|
|
|
|
/// If called on unreachable code, the above logic may report that the
|
|
|
|
/// instruction simplified to itself. Make life easier for users by
|
2010-12-15 11:02:22 +00:00
|
|
|
/// detecting that case here, returning a safe value instead.
|
|
|
|
return Result == I ? UndefValue::get(I->getType()) : Result;
|
2009-11-10 01:08:51 +00:00
|
|
|
}
|
|
|
|
|
2012-03-24 21:11:24 +00:00
|
|
|
/// \brief Implementation of recursive simplification through an instructions
|
|
|
|
/// uses.
|
2009-11-10 22:26:15 +00:00
|
|
|
///
|
2012-03-24 21:11:24 +00:00
|
|
|
/// This is the common implementation of the recursive simplification routines.
|
|
|
|
/// If we have a pre-simplified value in 'SimpleV', that is forcibly used to
|
|
|
|
/// replace the instruction 'I'. Otherwise, we simply add 'I' to the list of
|
|
|
|
/// instructions to process and attempt to simplify it using
|
|
|
|
/// InstructionSimplify.
|
|
|
|
///
|
|
|
|
/// This routine returns 'true' only when *it* simplifies something. The passed
|
|
|
|
/// in simplified value does not count toward this.
|
|
|
|
static bool replaceAndRecursivelySimplifyImpl(Instruction *I, Value *SimpleV,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2012-03-24 21:11:24 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
bool Simplified = false;
|
Try to harden the recursive simplification still further. This is again
spotted by inspection, and I've crafted no test case that triggers it on
my machine, but some of the windows builders are hitting what looks like
memory corruption, so *something* is amiss here.
This patch takes a more generalized approach to eliminating
double-visits. Imagine code such as:
%x = ...
%y = add %x, 1
%z = add %x, %y
You can imagine that if we simplify %x, we would add %y and %z to the
list. If the use-chain order happens to cause us to add them in reverse
order, we could pull %y off first, and simplify it, adding %z to the
list. We now have %z on the list twice, and will reference it after it
is deleted.
Currently, all my test cases happen to not trigger this, likely due to
the use-chain ordering, but there seems no guarantee that such
a situation could not occur, so we should handle it correctly.
Again, if anyone knows how to craft a testcase that actually triggers
this, please let me know.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153397 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-24 22:34:26 +00:00
|
|
|
SmallSetVector<Instruction *, 8> Worklist;
|
2012-03-24 21:11:24 +00:00
|
|
|
|
|
|
|
// If we have an explicit value to collapse to, do that round of the
|
|
|
|
// simplification loop by hand initially.
|
|
|
|
if (SimpleV) {
|
|
|
|
for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); UI != UE;
|
|
|
|
++UI)
|
2012-03-24 22:34:23 +00:00
|
|
|
if (*UI != I)
|
Try to harden the recursive simplification still further. This is again
spotted by inspection, and I've crafted no test case that triggers it on
my machine, but some of the windows builders are hitting what looks like
memory corruption, so *something* is amiss here.
This patch takes a more generalized approach to eliminating
double-visits. Imagine code such as:
%x = ...
%y = add %x, 1
%z = add %x, %y
You can imagine that if we simplify %x, we would add %y and %z to the
list. If the use-chain order happens to cause us to add them in reverse
order, we could pull %y off first, and simplify it, adding %z to the
list. We now have %z on the list twice, and will reference it after it
is deleted.
Currently, all my test cases happen to not trigger this, likely due to
the use-chain ordering, but there seems no guarantee that such
a situation could not occur, so we should handle it correctly.
Again, if anyone knows how to craft a testcase that actually triggers
this, please let me know.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153397 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-24 22:34:26 +00:00
|
|
|
Worklist.insert(cast<Instruction>(*UI));
|
2012-03-24 21:11:24 +00:00
|
|
|
|
|
|
|
// Replace the instruction with its simplified value.
|
|
|
|
I->replaceAllUsesWith(SimpleV);
|
|
|
|
|
|
|
|
// Gracefully handle edge cases where the instruction is not wired into any
|
|
|
|
// parent block.
|
|
|
|
if (I->getParent())
|
|
|
|
I->eraseFromParent();
|
|
|
|
} else {
|
Try to harden the recursive simplification still further. This is again
spotted by inspection, and I've crafted no test case that triggers it on
my machine, but some of the windows builders are hitting what looks like
memory corruption, so *something* is amiss here.
This patch takes a more generalized approach to eliminating
double-visits. Imagine code such as:
%x = ...
%y = add %x, 1
%z = add %x, %y
You can imagine that if we simplify %x, we would add %y and %z to the
list. If the use-chain order happens to cause us to add them in reverse
order, we could pull %y off first, and simplify it, adding %z to the
list. We now have %z on the list twice, and will reference it after it
is deleted.
Currently, all my test cases happen to not trigger this, likely due to
the use-chain ordering, but there seems no guarantee that such
a situation could not occur, so we should handle it correctly.
Again, if anyone knows how to craft a testcase that actually triggers
this, please let me know.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153397 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-24 22:34:26 +00:00
|
|
|
Worklist.insert(I);
|
2012-03-24 21:11:24 +00:00
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
Try to harden the recursive simplification still further. This is again
spotted by inspection, and I've crafted no test case that triggers it on
my machine, but some of the windows builders are hitting what looks like
memory corruption, so *something* is amiss here.
This patch takes a more generalized approach to eliminating
double-visits. Imagine code such as:
%x = ...
%y = add %x, 1
%z = add %x, %y
You can imagine that if we simplify %x, we would add %y and %z to the
list. If the use-chain order happens to cause us to add them in reverse
order, we could pull %y off first, and simplify it, adding %z to the
list. We now have %z on the list twice, and will reference it after it
is deleted.
Currently, all my test cases happen to not trigger this, likely due to
the use-chain ordering, but there seems no guarantee that such
a situation could not occur, so we should handle it correctly.
Again, if anyone knows how to craft a testcase that actually triggers
this, please let me know.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153397 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-24 22:34:26 +00:00
|
|
|
// Note that we must test the size on each iteration, the worklist can grow.
|
|
|
|
for (unsigned Idx = 0; Idx != Worklist.size(); ++Idx) {
|
|
|
|
I = Worklist[Idx];
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2012-03-24 21:11:24 +00:00
|
|
|
// See if this instruction simplifies.
|
|
|
|
SimpleV = SimplifyInstruction(I, TD, TLI, DT);
|
|
|
|
if (!SimpleV)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
Simplified = true;
|
|
|
|
|
|
|
|
// Stash away all the uses of the old instruction so we can check them for
|
|
|
|
// recursive simplifications after a RAUW. This is cheaper than checking all
|
|
|
|
// uses of To on the recursive step in most cases.
|
|
|
|
for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); UI != UE;
|
|
|
|
++UI)
|
Try to harden the recursive simplification still further. This is again
spotted by inspection, and I've crafted no test case that triggers it on
my machine, but some of the windows builders are hitting what looks like
memory corruption, so *something* is amiss here.
This patch takes a more generalized approach to eliminating
double-visits. Imagine code such as:
%x = ...
%y = add %x, 1
%z = add %x, %y
You can imagine that if we simplify %x, we would add %y and %z to the
list. If the use-chain order happens to cause us to add them in reverse
order, we could pull %y off first, and simplify it, adding %z to the
list. We now have %z on the list twice, and will reference it after it
is deleted.
Currently, all my test cases happen to not trigger this, likely due to
the use-chain ordering, but there seems no guarantee that such
a situation could not occur, so we should handle it correctly.
Again, if anyone knows how to craft a testcase that actually triggers
this, please let me know.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153397 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-24 22:34:26 +00:00
|
|
|
Worklist.insert(cast<Instruction>(*UI));
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2012-03-24 21:11:24 +00:00
|
|
|
// Replace the instruction with its simplified value.
|
|
|
|
I->replaceAllUsesWith(SimpleV);
|
|
|
|
|
|
|
|
// Gracefully handle edge cases where the instruction is not wired into any
|
|
|
|
// parent block.
|
|
|
|
if (I->getParent())
|
|
|
|
I->eraseFromParent();
|
2009-11-10 22:26:15 +00:00
|
|
|
}
|
2012-03-24 21:11:24 +00:00
|
|
|
return Simplified;
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2012-03-24 21:11:24 +00:00
|
|
|
bool llvm::recursivelySimplifyInstruction(Instruction *I,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2012-03-24 21:11:24 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
return replaceAndRecursivelySimplifyImpl(I, 0, TD, TLI, DT);
|
|
|
|
}
|
2010-11-14 11:23:23 +00:00
|
|
|
|
2012-03-24 21:11:24 +00:00
|
|
|
bool llvm::replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV,
|
2012-10-08 16:38:25 +00:00
|
|
|
const DataLayout *TD,
|
2012-03-24 21:11:24 +00:00
|
|
|
const TargetLibraryInfo *TLI,
|
|
|
|
const DominatorTree *DT) {
|
|
|
|
assert(I != SimpleV && "replaceAndRecursivelySimplify(X,X) is not valid!");
|
|
|
|
assert(SimpleV && "Must provide a simplified value.");
|
|
|
|
return replaceAndRecursivelySimplifyImpl(I, SimpleV, TD, TLI, DT);
|
2009-11-10 22:26:15 +00:00
|
|
|
}
|