https://gcc.gnu.org/g:ec9d9b6b2cbab28d58c5fe0d3f2e03845d8e00db

commit r15-8308-gec9d9b6b2cbab28d58c5fe0d3f2e03845d8e00db
Author: Kushal Pal <kushalpal...@gmail.com>
Date:   Wed Jul 31 10:53:35 2024 +0000

    gccrs: Improve compressed point bit manipulation
    
    gcc/rust/ChangeLog:
    
            * checks/errors/borrowck/polonius/rust-polonius.h (struct 
FullPoint):
            Added comments and made extraction of statement more verbose for
            better understanding.
            * checks/errors/borrowck/ffi-polonius/src/lib.rs: Likewise.
    
    Signed-off-by: Kushal Pal <kushalpal...@gmail.com>

Diff:
---
 .../checks/errors/borrowck/ffi-polonius/src/lib.rs  | 17 ++++++++++++++++-
 .../checks/errors/borrowck/polonius/rust-polonius.h | 21 +++++++++++++++++++--
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs 
b/gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs
index c5c0ae9756e5..b21dee3cbc66 100644
--- a/gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs
+++ b/gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs
@@ -105,9 +105,24 @@ impl From<gccrs_ffi::FactsView> for AllFacts<GccrsFacts> {
 
 fn print_point(point: GccrsAtom) {
     let val: usize = point.into();
+    // Point is a 32 bit unsigned integer
+    // 16               15              1
+    // xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx x
+    // ^~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~ ^
+    // |                |               |
+    // basic_block      |               start/mid
+    //                  statement
+    // the left most 16 bits store the basic block number
+    // the right most bit, represents the start/mid status
+    // the remaining 15 bits between these two represent the statement
     let mid = val % 2 == 1;
     let bb = val >> 16;
-    let stmt = (val >> 1) & ((1 << 15) - 1);
+    // firstly we can get rid of right most bit by performing left shift once
+    let hide_left_most_bit = val >> 1;
+    // now we only need the 15 bits on the right
+    // we can mask the remaining bits by performing bitwise AND with fifteen
+    // 1's which in hexadecimal is 0x7FFF
+    let stmt = hide_left_most_bit & 0x7FFF;
     eprint!("{}(bb{}[{}])", if mid { "Mid" } else { "Start" }, bb, stmt);
 }
 
diff --git a/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h 
b/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h
index 4447ad594304..0ce214218212 100644
--- a/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h
+++ b/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h
@@ -35,7 +35,7 @@ struct FullPoint
   bool mid;
 
   /** Expands a compressed `Point` into its components.
-   * See `Point` docs for encoding details.
+   * See `Point` docs for encoding details in ./rust-polonius-ffi.h
    */
   explicit FullPoint (Point point)
     : bb (extract_bb (point)), stmt (extract_stmt (point)),
@@ -45,7 +45,24 @@ struct FullPoint
   static uint32_t extract_bb (Point point) { return point >> 16; }
   static uint32_t extract_stmt (Point point)
   {
-    return (point >> 1) & ((1 << 15) - 1);
+    // Point is a 32 bit unsigned integer
+    // 16               15              1
+    // xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx x
+    // ^~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~ ^
+    // |                |               |
+    // basic_block      |               start/mid
+    //                  statement
+    // the left most 16 bits store the basic block number
+    // the right most bit, represents the start/mid status
+    // the remaining 15 bits between these two represent the statement number
+    // which we need to extract in this fucntion
+    //
+    // firstly we can get rid of right most bit by performing left shift once
+    auto hide_left_most_bit = point >> 1;
+    // now we only need the 15 bits on the right
+    // we can mask the remaining bits by performing bitwise AND with fifteen
+    // 1's which in hexadecimal is 0x7FFF
+    return hide_left_most_bit & 0x7FFF;
   }
   static bool extract_mid (Point point) { return point & 1; }

Reply via email to