From f9e4a986c03fe3af7dbc9de0b0a9251280fbdf41 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Tue, 1 Feb 2011 09:06:20 +0000 Subject: [PATCH] Add a m_Undef pattern for convenience. This is so that code that uses pattern matching can also pattern match undef, creating a more uniform style. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124657 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/PatternMatch.h | 10 +++++++++ lib/Analysis/InstructionSimplify.cpp | 32 ++++++++++++++-------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/include/llvm/Support/PatternMatch.h b/include/llvm/Support/PatternMatch.h index ea065a769ec..cb94fe5f6ec 100644 --- a/include/llvm/Support/PatternMatch.h +++ b/include/llvm/Support/PatternMatch.h @@ -75,6 +75,16 @@ inline constantint_ty m_ConstantInt() { return constantint_ty(); } +struct undef_ty { + template + bool match(ITy *V) { + return isa(V); + } +}; + +/// m_Undef() - Match an arbitrary undef constant. +inline undef_ty m_Undef() { return undef_ty(); } + struct zero_ty { template bool match(ITy *V) { diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index bce9a1fa078..6ca4dddcf36 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -510,7 +510,7 @@ static Value *SimplifyAddInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW, } // X + undef -> undef - if (isa(Op1)) + if (match(Op1, m_Undef())) return Op1; // X + 0 -> X @@ -576,7 +576,7 @@ static Value *SimplifySubInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW, // X - undef -> undef // undef - X -> undef - if (isa(Op0) || isa(Op1)) + if (match(Op0, m_Undef()) || match(Op1, m_Undef())) return UndefValue::get(Op0->getType()); // X - 0 -> X @@ -699,7 +699,7 @@ static Value *SimplifyMulInst(Value *Op0, Value *Op1, const TargetData *TD, } // X * undef -> 0 - if (isa(Op1)) + if (match(Op1, m_Undef())) return Constant::getNullValue(Op0->getType()); // X * 0 -> 0 @@ -771,11 +771,11 @@ static Value *SimplifyDiv(unsigned Opcode, Value *Op0, Value *Op1, bool isSigned = Opcode == Instruction::SDiv; // X / undef -> undef - if (isa(Op1)) + if (match(Op1, m_Undef())) return Op1; // undef / X -> 0 - if (isa(Op0)) + if (match(Op0, m_Undef())) return Constant::getNullValue(Op0->getType()); // 0 / X -> 0, we don't need to preserve faults! @@ -859,14 +859,14 @@ Value *llvm::SimplifyUDivInst(Value *Op0, Value *Op1, const TargetData *TD, return ::SimplifyUDivInst(Op0, Op1, TD, DT, RecursionLimit); } -static Value *SimplifyFDivInst(Value *Op0, Value *Op1, const TargetData *TD, - const DominatorTree *DT, unsigned MaxRecurse) { +static Value *SimplifyFDivInst(Value *Op0, Value *Op1, const TargetData *, + const DominatorTree *, unsigned) { // undef / X -> undef (the undef could be a snan). - if (isa(Op0)) + if (match(Op0, m_Undef())) return Op0; // X / undef -> undef - if (isa(Op1)) + if (match(Op1, m_Undef())) return Op1; return 0; @@ -898,7 +898,7 @@ static Value *SimplifyShift(unsigned Opcode, Value *Op0, Value *Op1, return Op0; // X shift by undef -> undef because it may shift by the bitwidth. - if (isa(Op1)) + if (match(Op1, m_Undef())) return Op1; // Shifting by the bitwidth or more is undefined. @@ -930,7 +930,7 @@ static Value *SimplifyShlInst(Value *Op0, Value *Op1, const TargetData *TD, return V; // undef << X -> 0 - if (isa(Op0)) + if (match(Op0, m_Undef())) return Constant::getNullValue(Op0->getType()); return 0; @@ -949,7 +949,7 @@ static Value *SimplifyLShrInst(Value *Op0, Value *Op1, const TargetData *TD, return V; // undef >>l X -> 0 - if (isa(Op0)) + if (match(Op0, m_Undef())) return Constant::getNullValue(Op0->getType()); return 0; @@ -972,7 +972,7 @@ static Value *SimplifyAShrInst(Value *Op0, Value *Op1, const TargetData *TD, return Op0; // undef >>a X -> all ones - if (isa(Op0)) + if (match(Op0, m_Undef())) return Constant::getAllOnesValue(Op0->getType()); return 0; @@ -999,7 +999,7 @@ static Value *SimplifyAndInst(Value *Op0, Value *Op1, const TargetData *TD, } // X & undef -> 0 - if (isa(Op1)) + if (match(Op1, m_Undef())) return Constant::getNullValue(Op0->getType()); // X & X = X @@ -1088,7 +1088,7 @@ static Value *SimplifyOrInst(Value *Op0, Value *Op1, const TargetData *TD, } // X | undef -> -1 - if (isa(Op1)) + if (match(Op1, m_Undef())) return Constant::getAllOnesValue(Op0->getType()); // X | X = X @@ -1172,7 +1172,7 @@ static Value *SimplifyXorInst(Value *Op0, Value *Op1, const TargetData *TD, } // A ^ undef -> undef - if (isa(Op1)) + if (match(Op1, m_Undef())) return Op1; // A ^ 0 = A