[PATCH] aarch64: MTE compatible strrchr

Alex Butler Alex.Butler@arm.com
Tue Jun 9 16:09:36 GMT 2020


This patch adds an MTE compatible implementation of strrchr.

Please see the benchmark results for the performance uplift.

| length | alignment | uplift A72  | uplift A53  | uplift N1   |
|--------+-----------+-------------|-------------|-------------|
|   2048 |         0 |       0.91x |       0.80x |       0.98x |
|   2048 |         1 |       0.88x |       0.79x |       0.91x |
|   2048 |         0 |       0.92x |       0.80x |       1.00x |
|   2048 |         2 |       0.92x |       0.80x |       0.97x |
|   2048 |         0 |       0.93x |       0.80x |       1.01x |
|   2048 |         3 |       0.92x |       0.80x |       0.93x |
|   2048 |         0 |       0.95x |       0.80x |       1.00x |
|   2048 |         4 |       0.93x |       0.80x |       0.98x |
|   2048 |         0 |       0.95x |       0.81x |       1.03x |
|   2048 |         5 |       0.91x |       0.79x |       0.95x |
|   2048 |         0 |       0.93x |       0.80x |       0.97x |
|   2048 |         6 |       1.01x |       0.85x |       1.12x |
|   2048 |         0 |       1.27x |       0.93x |       1.40x |
|   2048 |         7 |       1.23x |       0.92x |       1.38x |
|    256 |         1 |       0.92x |       0.80x |       1.00x |
|    256 |         1 |       0.96x |       0.82x |       1.06x |
|    256 |         2 |       0.96x |       0.82x |       1.07x |
|    256 |         2 |       0.96x |       0.82x |       1.06x |
|    256 |         3 |       0.92x |       0.80x |       0.99x |
|    256 |         3 |       0.96x |       0.82x |       1.06x |
|    256 |         4 |       0.96x |       0.82x |       1.07x |
|    256 |         4 |       0.90x |       0.80x |       1.00x |
|    256 |         5 |       0.95x |       0.82x |       1.08x |
|    256 |         5 |       0.96x |       0.82x |       1.06x |
|    256 |         6 |       0.95x |       0.83x |       1.04x |
|    256 |         6 |       0.95x |       0.81x |       1.03x |
|    256 |         7 |       0.97x |       0.82x |       1.05x |
|    256 |         7 |       0.97x |       0.82x |       1.05x |
|      1 |         0 |       1.09x |       1.37x |       1.41x |
|      1 |         0 |       1.09x |       1.38x |       1.42x |
|      2 |         0 |       1.09x |       1.37x |       1.41x |
|      2 |         0 |       1.09x |       1.38x |       1.37x |
|      3 |         0 |       1.09x |       1.38x |       1.42x |
|      3 |         0 |       1.09x |       1.37x |       1.41x |
|      4 |         0 |       1.09x |       1.38x |       1.42x |
|      4 |         0 |       1.10x |       1.37x |       1.41x |
|      5 |         0 |       1.09x |       1.37x |       1.42x |
|      5 |         0 |       1.09x |       1.38x |       1.42x |
|      6 |         0 |       1.09x |       1.36x |       1.42x |
|      6 |         0 |       1.09x |       1.37x |       1.41x |
|      7 |         0 |       1.10x |       1.37x |       1.40x |
|      7 |         0 |       1.09x |       1.38x |       1.40x |
|      8 |         0 |       1.09x |       1.37x |       1.41x |
|      8 |         0 |       1.08x |       1.36x |       1.40x |
|      9 |         0 |       1.09x |       1.38x |       1.40x |
|      9 |         0 |       1.08x |       1.38x |       1.42x |
|     10 |         0 |       1.09x |       1.36x |       1.41x |
|     10 |         0 |       1.09x |       1.37x |       1.41x |
|     11 |         0 |       1.09x |       1.37x |       1.45x |
|     11 |         0 |       1.09x |       1.37x |       1.38x |
|     12 |         0 |       1.09x |       1.37x |       1.38x |
|     12 |         0 |       1.10x |       1.36x |       1.41x |
|     13 |         0 |       1.09x |       1.36x |       1.39x |
|     13 |         0 |       1.09x |       1.36x |       1.42x |
|     14 |         0 |       1.09x |       1.37x |       1.52x |
|     14 |         0 |       1.09x |       1.37x |       1.40x |
|     15 |         0 |       1.09x |       1.37x |       1.42x |
|     15 |         0 |       1.09x |       1.37x |       1.40x |
|     16 |         0 |       0.87x |       0.89x |       0.98x |
|     16 |         0 |       0.87x |       0.88x |       0.92x |
|     17 |         0 |       0.88x |       1.04x |       1.19x |
|     17 |         0 |       0.87x |       1.04x |       1.17x |
|     18 |         0 |       0.88x |       1.03x |       1.20x |
|     18 |         0 |       0.88x |       1.04x |       1.19x |
|     19 |         0 |       0.87x |       1.04x |       1.19x |
|     19 |         0 |       0.88x |       1.04x |       1.19x |
|     20 |         0 |       0.88x |       1.05x |       1.18x |
|     20 |         0 |       0.88x |       1.04x |       1.20x |
|     21 |         0 |       0.88x |       1.03x |       1.20x |
|     21 |         0 |       0.87x |       1.04x |       1.19x |
|     22 |         0 |       0.88x |       1.05x |       1.19x |
|     22 |         0 |       0.88x |       1.04x |       1.19x |
|     23 |         0 |       0.87x |       1.03x |       1.19x |
|     23 |         0 |       0.88x |       1.04x |       1.20x |
|     24 |         0 |       0.88x |       1.05x |       1.20x |
|     24 |         0 |       0.88x |       1.04x |       1.18x |
|     25 |         0 |       0.88x |       1.03x |       1.20x |
|     25 |         0 |       0.88x |       1.05x |       1.20x |
|     26 |         0 |       0.88x |       1.04x |       1.21x |
|     26 |         0 |       0.87x |       1.03x |       1.19x |
|     27 |         0 |       0.88x |       1.05x |       1.20x |
|     27 |         0 |       0.88x |       1.03x |       1.18x |
|     28 |         0 |       0.88x |       1.04x |       1.17x |
|     28 |         0 |       0.88x |       1.05x |       1.18x |
|     29 |         0 |       0.87x |       1.03x |       1.19x |
|     29 |         0 |       0.88x |       1.05x |       1.20x |
|     30 |         0 |       0.88x |       1.03x |       1.16x |
|     30 |         0 |       0.88x |       1.05x |       1.19x |
|     31 |         0 |       0.87x |       1.03x |       1.19x |
|     31 |         0 |       0.88x |       1.05x |       1.29x |
|     32 |         0 |       1.14x |       1.04x |       1.20x |
|     32 |         0 |       1.14x |       1.05x |       1.19x |
|   2048 |         0 |       1.00x |       1.05x |       1.24x |
|   2048 |         1 |       0.55x |       1.00x |       1.00x |
|   2048 |         0 |       1.16x |       0.96x |       1.11x |
|   2048 |         2 |       1.09x |       0.94x |       1.06x |
|   2048 |         0 |       1.13x |       0.82x |       1.13x |
|   2048 |         3 |       1.11x |       0.87x |       1.08x |
|   2048 |         0 |       1.15x |       0.84x |       1.13x |
|   2048 |         4 |       1.08x |       0.79x |       1.09x |
|   2048 |         0 |       0.97x |       0.80x |       1.09x |
|   2048 |         5 |       1.11x |       0.80x |       1.08x |
|   2048 |         0 |       1.12x |       0.78x |       1.07x |
|   2048 |         6 |       1.00x |       0.77x |       1.08x |
|   2048 |         0 |       1.19x |       0.76x |       1.05x |
|   2048 |         7 |       1.15x |       0.76x |       1.07x |
|    256 |         1 |       1.08x |       0.94x |       1.06x |
|    256 |         1 |       1.05x |       0.94x |       1.06x |
|    256 |         2 |       1.07x |       0.94x |       1.06x |
|    256 |         2 |       1.09x |       0.94x |       1.06x |
|    256 |         3 |       1.08x |       0.93x |       1.06x |
|    256 |         3 |       1.09x |       0.93x |       1.04x |
|    256 |         4 |       1.08x |       0.94x |       1.06x |
|    256 |         4 |       1.09x |       0.94x |       1.04x |
|    256 |         5 |       1.08x |       0.93x |       1.10x |
|    256 |         5 |       1.08x |       0.94x |       1.07x |
|    256 |         6 |       1.08x |       0.94x |       1.06x |
|    256 |         6 |       1.07x |       0.93x |       1.07x |
|    256 |         7 |       1.08x |       0.94x |       1.04x |
|    256 |         7 |       1.08x |       0.94x |       1.07x |
|      1 |         0 |       0.96x |       1.23x |       1.14x |
|      1 |         0 |       1.04x |       1.24x |       1.15x |
|      2 |         0 |       1.04x |       1.24x |       1.13x |
|      2 |         0 |       1.01x |       1.24x |       1.14x |
|      3 |         0 |       1.04x |       1.24x |       1.14x |
|      3 |         0 |       1.04x |       1.24x |       1.14x |
|      4 |         0 |       1.04x |       1.24x |       1.13x |
|      4 |         0 |       1.04x |       1.24x |       1.14x |
|      5 |         0 |       1.04x |       1.24x |       1.14x |
|      5 |         0 |       1.04x |       1.24x |       1.14x |
|      6 |         0 |       1.04x |       1.24x |       1.14x |
|      6 |         0 |       1.05x |       1.24x |       1.14x |
|      7 |         0 |       1.04x |       1.23x |       1.14x |
|      7 |         0 |       1.03x |       1.24x |       1.14x |
|      8 |         0 |       1.04x |       1.23x |       1.14x |
|      8 |         0 |       1.04x |       1.24x |       1.13x |
|      9 |         0 |       1.04x |       1.24x |       1.14x |
|      9 |         0 |       1.04x |       1.24x |       1.13x |
|     10 |         0 |       1.04x |       1.24x |       1.14x |
|     10 |         0 |       1.04x |       1.24x |       1.14x |
|     11 |         0 |       1.04x |       1.23x |       1.14x |
|     11 |         0 |       1.04x |       1.24x |       1.14x |
|     12 |         0 |       1.04x |       1.24x |       1.14x |
|     12 |         0 |       1.04x |       1.24x |       1.13x |
|     13 |         0 |       1.04x |       1.24x |       1.14x |
|     13 |         0 |       1.04x |       1.24x |       1.13x |
|     14 |         0 |       1.04x |       1.23x |       1.14x |
|     14 |         0 |       1.04x |       1.24x |       1.14x |
|     15 |         0 |       1.04x |       1.24x |       1.14x |
|     15 |         0 |       1.04x |       1.24x |       1.14x |
|     16 |         0 |       1.04x |       1.26x |       1.14x |
|     16 |         0 |       1.04x |       1.24x |       1.14x |
|     17 |         0 |       0.84x |       0.94x |       0.96x |
|     17 |         0 |       0.83x |       0.95x |       0.96x |
|     18 |         0 |       0.83x |       0.94x |       0.96x |
|     18 |         0 |       0.83x |       0.94x |       0.97x |
|     19 |         0 |       0.83x |       0.93x |       0.96x |
|     19 |         0 |       0.83x |       0.93x |       0.96x |
|     20 |         0 |       0.83x |       0.94x |       0.96x |
|     20 |         0 |       0.82x |       0.94x |       0.96x |
|     21 |         0 |       0.83x |       0.95x |       0.96x |
|     21 |         0 |       0.83x |       0.94x |       0.96x |
|     22 |         0 |       0.82x |       0.93x |       0.96x |
|     22 |         0 |       0.83x |       0.93x |       0.96x |
|     23 |         0 |       0.83x |       0.94x |       0.96x |
|     23 |         0 |       0.82x |       0.95x |       0.96x |
|     24 |         0 |       0.83x |       0.94x |       0.96x |
|     24 |         0 |       0.83x |       0.93x |       0.96x |
|     25 |         0 |       0.82x |       0.94x |       0.96x |
|     25 |         0 |       0.84x |       0.94x |       0.96x |
|     26 |         0 |       0.83x |       0.94x |       0.93x |
|     26 |         0 |       0.83x |       0.94x |       0.96x |
|     27 |         0 |       0.84x |       0.94x |       0.97x |
|     27 |         0 |       0.83x |       0.94x |       0.96x |
|     28 |         0 |       0.83x |       0.94x |       0.96x |
|     28 |         0 |       0.83x |       0.94x |       0.96x |
|     29 |         0 |       0.83x |       0.94x |       0.96x |
|     29 |         0 |       0.83x |       0.94x |       0.96x |
|     30 |         0 |       0.83x |       0.93x |       0.80x |
|     30 |         0 |       0.83x |       0.95x |       0.84x |
|     31 |         0 |       0.83x |       0.94x |       1.01x |
|     31 |         0 |       0.83x |       0.94x |       1.02x |
|     32 |         0 |       0.83x |       0.94x |       0.96x |
|     32 |         0 |       0.83x |       0.93x |       0.96x |

This patch passes the tests with no regressions.

8< --- 8< --- 8<
Add support for MTE to strrchr. Regression tested with xcheck and benchmarked
with glibc's benchtests on the Cortex-A53, Cortex-A72, and Neoverse N1.

The existing implementation assumes that any access to the pages in which the
string resides is safe. This assumption is not true when MTE is enabled. This
patch updates the algorithm to ensure that accesses remain within the bounds
of an MTE tag (16-byte chunks) and improves overall performance.

Co-authored-by: Wilco Dijkstra <wilco.dijkstra@arm.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-aarch64-add-MTE-compatible-strrchr.patch
Type: text/x-patch
Size: 7963 bytes
Desc: 0001-aarch64-add-MTE-compatible-strrchr.patch
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20200609/b70ab19f/attachment-0001.bin>


More information about the Libc-alpha mailing list