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

commit r16-7051-gd1b30abe52228923ba389173c02c0186d25be1ab
Author: Andrew Pinski <[email protected]>
Date:   Sun Jan 25 22:23:51 2026 -0800

    slsr: Use the correct type to try to convert to for inserting on edge case 
[PR123820]
    
    I had noticed there was code that will convert the stride
    to the correct type
    What I didn't realize was the type which it was trying to
    use was stride_type but for this case it should have been using
    the type of the lhs. This fixes that oversight. Note for pointers
    we still want to use stride_type like what is done right above.
    
    I don't have a testcase that does not use LTO though. I didn't figure
    out why this testcase needed LTO though.
    
    Bootstrapped and tested on x86_64-linux-gnu.
    
            PR tree-optimization/123820
    
    gcc/ChangeLog:
    
            * gimple-ssa-strength-reduction.cc (create_add_on_incoming_edge): 
Use
            the correct type for the stride (lhs if non-pointer).
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/torture/pr123820-1.C: New test.
    
    Signed-off-by: Andrew Pinski <[email protected]>

Diff:
---
 gcc/gimple-ssa-strength-reduction.cc      |  5 ++--
 gcc/testsuite/g++.dg/torture/pr123820-1.C | 41 +++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/gcc/gimple-ssa-strength-reduction.cc 
b/gcc/gimple-ssa-strength-reduction.cc
index f3571e10e90d..ced2235498cb 100644
--- a/gcc/gimple-ssa-strength-reduction.cc
+++ b/gcc/gimple-ssa-strength-reduction.cc
@@ -2356,10 +2356,11 @@ create_add_on_incoming_edge (slsr_cand_t c, tree 
basis_name,
        }
       else {
        tree stride;
+       tree wanted_type = POINTER_TYPE_P (basis_type) ? c->stride_type : 
basis_type;
 
-       if (!types_compatible_p (TREE_TYPE (c->stride), c->stride_type))
+       if (!types_compatible_p (TREE_TYPE (c->stride), wanted_type))
          {
-           tree cast_stride = make_temp_ssa_name (c->stride_type, NULL,
+           tree cast_stride = make_temp_ssa_name (wanted_type, NULL,
                                                   "slsr");
            cast_stmt = gimple_build_assign (cast_stride, NOP_EXPR,
                                             c->stride);
diff --git a/gcc/testsuite/g++.dg/torture/pr123820-1.C 
b/gcc/testsuite/g++.dg/torture/pr123820-1.C
new file mode 100644
index 000000000000..3c9d1f0127a3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr123820-1.C
@@ -0,0 +1,41 @@
+/* { dg-do run } */
+/* PR tree-optimization/123820 */
+
+struct Trit { char value; };
+
+struct Matrix {
+    int width;
+    Trit* data;
+
+    Trit& at(int x, int y) {
+        if (!(x >= y)) __builtin_abort ();
+        return data[y * width];
+    }
+};
+
+
+Trit set_value;
+[[gnu::used]]
+int EmbedPositionDetectionPattern_yStart;
+
+[[gnu::used,gnu::noipa]]
+void EmbedPositionDetectionPattern(Matrix& m) {
+    for (int y = 0; y < 7; ++y)
+        for (int x = 0; x < 7; ++x)
+            m.at(x, EmbedPositionDetectionPattern_yStart + y) = {0};
+
+    for (int i = 1; i < 8; ++i) {
+        if (i < m.width)
+            m.at(i, 7) = {0};
+
+        int y = EmbedPositionDetectionPattern_yStart + i;
+        if (7 < m.width && y)
+            m.at(7, y) = {0};
+    }
+}
+
+int main()
+{
+  return 0;
+}
+

Reply via email to