From ceb662830a23aef1813eedde2428218c5d3d8468 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 22 Oct 2026 10:55:07 +0200 Subject: [PATCH 1/2] add coccinelle rule for accessor calls in loops --- .ci/linters/cocci/accessor_call_in_loop.cocci | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .ci/linters/cocci/accessor_call_in_loop.cocci diff --git a/.ci/linters/cocci/accessor_call_in_loop.cocci b/.ci/linters/cocci/accessor_call_in_loop.cocci new file mode 100644 index 0000000000..e4b58b77d8 --- /dev/null +++ b/.ci/linters/cocci/accessor_call_in_loop.cocci @@ -0,0 +1,18 @@ +@@ +identifier acc = {RAW, RAW_RO, LOGICAL, LOGICAL_RO, INTEGER, INTEGER_RO, REAL, REAL_RO, COMPLEX, COMPLEX_RO, STRING_PTR_RO}; +idexpression x; +expression I, e; +@@ +( + for (...;...;...) { <+... when != x = e +* acc(x)[I] + ...+> } +| + while (...) { <+... when != x = e +* acc(x)[I] + ...+> } +| + do { <+... when != x = e +* acc(x)[I] + ...+> } while (...); +) From 5fcd3dc83bef98a49a810d0c1b16aa586407d9f7 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Tue, 10 Nov 2026 00:57:35 +0100 Subject: [PATCH 2/2] narrow accessor-in-loop coccinelle rule --- .ci/linters/cocci/accessor_call_in_loop.cocci | 75 +++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/.ci/linters/cocci/accessor_call_in_loop.cocci b/.ci/linters/cocci/accessor_call_in_loop.cocci index e4b58b77d8..f55983cc49 100644 --- a/.ci/linters/cocci/accessor_call_in_loop.cocci +++ b/.ci/linters/cocci/accessor_call_in_loop.cocci @@ -1,18 +1,79 @@ -@@ +/* Hoist accessor calls on loop-invariant variables out of loops */ +@accessed@ identifier acc = {RAW, RAW_RO, LOGICAL, LOGICAL_RO, INTEGER, INTEGER_RO, REAL, REAL_RO, COMPLEX, COMPLEX_RO, STRING_PTR_RO}; idexpression x; +@@ + acc(x) +@@ +identifier acc = {RAW, RAW_RO, LOGICAL, LOGICAL_RO, INTEGER, INTEGER_RO, REAL, REAL_RO, COMPLEX, COMPLEX_RO, STRING_PTR_RO}; +idexpression accessed.x; expression I, e; +constant C; +statement S; @@ ( - for (...;...;...) { <+... when != x = e + for (...;...;x = e) S +| + for (...;...;...) { + ... when any + x = e + ... when any + } +| + while (...) { + ... when any + x = e + ... when any + } +| + do { + ... when any + x = e + ... when any + } while (...); +| + for (...;...;...) { + ... when any +( + acc(x)[C] +| * acc(x)[I] - ...+> } +) + ... when any + } +| + while (...) { + ... when any +( + acc(x)[C] | - while (...) { <+... when != x = e * acc(x)[I] - ...+> } +) + ... when any + } +| + do { + ... when any +( + acc(x)[C] | - do { <+... when != x = e * acc(x)[I] - ...+> } while (...); +) + ... when any + } while (...); +| + for (...; <+... acc(x)[C] ...+>; ...) S +| + while (<+... acc(x)[C] ...+>) S +| + for (...; + <+... +* acc(x)[I] + ...+>; + ...) S +| + while ( + <+... +* acc(x)[I] + ...+>) S )