]> granicus.if.org Git - llvm/commitdiff
[Attributor][NFC] Add merge/join/clamp operators to the IntegerState
authorJohannes Doerfert <jdoerfert@anl.gov>
Wed, 14 Aug 2019 21:35:20 +0000 (21:35 +0000)
committerJohannes Doerfert <jdoerfert@anl.gov>
Wed, 14 Aug 2019 21:35:20 +0000 (21:35 +0000)
Differential Revision: https://reviews.llvm.org/D66146

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368925 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/IPO/Attributor.h
lib/Transforms/IPO/Attributor.cpp

index ed3e572d953dfb1ca3c8b5d6805f649ce541bfc8..484dd0c31e25f0803a97f4c0be66092a71461346 100644 (file)
@@ -887,6 +887,31 @@ struct IntegerState : public AbstractState {
            this->getKnown() == R.getKnown();
   }
 
+  /// Inequality for IntegerState.
+  bool operator!=(const IntegerState &R) const { return !(*this == R); }
+
+  /// "Clamp" this state with \p R. The result is the maximum of the known
+  /// information but the minimum of the assumed.
+  IntegerState operator^=(const IntegerState &R) {
+    takeKnownMaximum(R.Known);
+    takeAssumedMinimum(R.Assumed);
+    return *this;
+  }
+
+  /// Make this the minimum, known and assumed, of this state and \p R.
+  IntegerState operator&=(const IntegerState &R) {
+    Known = std::min(Known, R.Known);
+    Assumed = std::min(Assumed, R.Assumed);
+    return *this;
+  }
+
+  /// Make this the maximum, known and assumed, of this state and \p R.
+  IntegerState operator|=(const IntegerState &R) {
+    Known = std::max(Known, R.Known);
+    Assumed = std::max(Assumed, R.Assumed);
+    return *this;
+  }
+
 private:
   /// The known state encoding in an integer of type base_t.
   base_t Known = getWorstState();
index b5d80dc99b2702aae0d7c0a6f44bd77a5862cb38..4a1b3521711f41d669c61b056b1b0697645e60f2 100644 (file)
@@ -1650,6 +1650,30 @@ struct DerefState : AbstractState {
     return this->DerefBytesState == R.DerefBytesState &&
            this->GlobalState == R.GlobalState;
   }
+
+  /// Inequality for IntegerState.
+  bool operator!=(const DerefState &R) { return !(*this == R); }
+
+  /// See IntegerState::operator^=
+  DerefState operator^=(const DerefState &R) {
+    DerefBytesState ^= R.DerefBytesState;
+    GlobalState ^= R.GlobalState;
+    return *this;
+  }
+
+  /// See IntegerState::operator&=
+  DerefState operator&=(const DerefState &R) {
+    DerefBytesState &= R.DerefBytesState;
+    GlobalState &= R.GlobalState;
+    return *this;
+  }
+
+  /// See IntegerState::operator|=
+  DerefState operator|=(const DerefState &R) {
+    DerefBytesState |= R.DerefBytesState;
+    GlobalState |= R.GlobalState;
+    return *this;
+  }
 };
 
 struct AADereferenceableImpl : AADereferenceable, DerefState {