Add a m_Undef pattern for convenience. This is so that code that uses
authorDuncan Sands <baldrick@free.fr>
Tue, 1 Feb 2011 09:06:20 +0000 (09:06 +0000)
committerDuncan Sands <baldrick@free.fr>
Tue, 1 Feb 2011 09:06:20 +0000 (09:06 +0000)
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
lib/Analysis/InstructionSimplify.cpp

index ea065a769ecfe892ed0aceea66883bfede9dfb35..cb94fe5f6ecbff9682be02caba741b65f5962b8a 100644 (file)
@@ -75,6 +75,16 @@ inline constantint_ty<Val> m_ConstantInt() {
   return constantint_ty<Val>();
 }
 
+struct undef_ty {
+  template<typename ITy>
+  bool match(ITy *V) {
+    return isa<UndefValue>(V);
+  }
+};
+
+/// m_Undef() - Match an arbitrary undef constant.
+inline undef_ty m_Undef() { return undef_ty(); }
+
 struct zero_ty {
   template<typename ITy>
   bool match(ITy *V) {
index bce9a1fa0786d61912174adbb206731cc301cf25..6ca4dddcf36ae6ce64857e4b3161567a2bbc34e6 100644 (file)
@@ -510,7 +510,7 @@ static Value *SimplifyAddInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
   }
 
   // X + undef -> undef
-  if (isa<UndefValue>(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<UndefValue>(Op0) || isa<UndefValue>(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<UndefValue>(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<UndefValue>(Op1))
+  if (match(Op1, m_Undef()))
     return Op1;
 
   // undef / X -> 0
-  if (isa<UndefValue>(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<UndefValue>(Op0))
+  if (match(Op0, m_Undef()))
     return Op0;
 
   // X / undef -> undef
-  if (isa<UndefValue>(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<UndefValue>(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<UndefValue>(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<UndefValue>(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<UndefValue>(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<UndefValue>(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<UndefValue>(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<UndefValue>(Op1))
+  if (match(Op1, m_Undef()))
     return Op1;
 
   // A ^ 0 = A