[PATCH] D60012: [Attributor] Introduce bit-encodings for abstract states
Johannes Doerfert via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 30 12:43:38 PDT 2019
jdoerfert updated this revision to Diff 192988.
jdoerfert added a comment.
Simplify the interface & make it impossible to break invariances
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D60012/new/
https://reviews.llvm.org/D60012
Files:
llvm/lib/Transforms/IPO/Attributor.cpp
Index: llvm/lib/Transforms/IPO/Attributor.cpp
===================================================================
--- llvm/lib/Transforms/IPO/Attributor.cpp
+++ llvm/lib/Transforms/IPO/Attributor.cpp
@@ -73,6 +73,87 @@
}
///}
+/// Simple state with integers encoding.
+///
+/// The interface ensures that the assumed bits are always a subset of the known
+/// bits. Users can only add known bits and, except through adding known bits,
+/// they can only remove assumed bits. This should guarantee monotoniticy and
+/// thereby the existence of a fixpoint (if used corretly). The fixpoint is
+/// reached when the assumed and known state/bits are equal. Users can
+/// force/inidicate a fixpoint. If an optimistic one is indicated, the known
+/// state will catch up with the assumed one, for a pessimistic fixpoint it is
+/// the other way around.
+struct IntegerState : public AbstractState {
+ /// Undrlying integer type, we assume 32 bits to be enough.
+ using base_t = uint32_t;
+
+ /// Return the best possible representable state.
+ static constexpr base_t getBestState() { return ~0; }
+
+ /// Return the worst possible representable state.
+ static constexpr base_t getWorstState() { return 0; }
+
+ /// See AbstractState::isValidState()
+ /// NOTE: For now we simply pretend that the worst possible state is invalid.
+ bool isValidState() const override { return Assumed != getWorstState(); }
+
+ /// See AbstractState::isAtFixpoint()
+ bool isAtFixpoint() const override { return Assumed == Known; }
+
+ /// See AbstractState::indicateFixpoint(...)
+ void indicateFixpoint(bool Optimistic) override {
+ if (Optimistic)
+ Known = Assumed;
+ else
+ Assumed = Known;
+ }
+
+ /// Return the known state encoding
+ base_t getKnown() const { return Known; }
+
+ /// Return the assumed state encoding.
+ base_t getAssumed() const { return Assumed; }
+
+ /// Return true if the bits set in \p BitsEncoding are "known bits".
+ bool isKnown(base_t BitsEncoding) const {
+ return (Known & BitsEncoding) == BitsEncoding;
+ }
+
+ /// Return true if the bits set in \p BitsEncoding are "assumed bits".
+ bool isAssumed(base_t BitsEncoding) const {
+ return (Assumed & BitsEncoding) == BitsEncoding;
+ }
+
+ /// Add the bits in \p BitsEncoding to the "known bits".
+ IntegerState &addKnownBits(base_t Bits) {
+ // Make sure we never miss any "known bits".
+ Assumed |= Bits;
+ Known |= Bits;
+ return *this;
+ }
+
+ /// Remove the bits in \p BitsEncoding from the "assumed bits" if not known.
+ IntegerState &removeAssumedBits(base_t BitsEncoding) {
+ // Make sure we never loose any "known bits".
+ Assumed = (Assumed & ~BitsEncoding) | Known;
+ return *this;
+ }
+
+ /// Keep only "assumed bits" also set in \p BitsEncoding but all known ones.
+ IntegerState &intersectAssumedBits(base_t BitsEncoding) {
+ // Make sure we never loose any "known bits".
+ Assumed = (Assumed & BitsEncoding) | Known;
+ return *this;
+ }
+
+private:
+ /// The known state encoding in an integer of type base_t.
+ base_t Known = getWorstState();
+
+ /// The assumed state encoding in an integer of type base_t.
+ base_t Assumed = getBestState();
+};
+
/// Helper to adjust the statistics.
static void bookkeeping(AbstractAttribute::ManifestPosition MP,
const Attribute &Attr) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D60012.192988.patch
Type: text/x-patch
Size: 3374 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190330/98650f65/attachment.bin>
More information about the llvm-commits
mailing list