diff mbox series

Fix accounting of offsets in unadjusted_ptr_and_unit_offset

Message ID Zp6EszVp-F8krmh4@kam.mff.cuni.cz
State New
Headers show
Series Fix accounting of offsets in unadjusted_ptr_and_unit_offset | expand

Commit Message

Jan Hubicka July 22, 2024, 4:11 p.m. UTC
Hi,
unadjusted_ptr_and_unit_offset accidentally throws away the offset computed by
get_addr_base_and_unit_offset. Instead of passing extra_offset it passes offset.

Bootstrapped/regtested x86_64-linux and comitted.  Will backport it to gcc14

	PR ipa/114207

gcc/ChangeLog:

	* ipa-prop.cc (unadjusted_ptr_and_unit_offset): Fix accounting of offsets in ADDR_EXPR.

gcc/testsuite/ChangeLog:

	* gcc.c-torture/execute/pr114207.c: New test.
diff mbox series

Patch

diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index 7d7cb3835d2..99ebd6229ec 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -1370,9 +1370,9 @@  unadjusted_ptr_and_unit_offset (tree op, tree *ret, poly_int64 *offset_ret)
     {
       if (TREE_CODE (op) == ADDR_EXPR)
 	{
-	  poly_int64 extra_offset = 0;
+	  poly_int64 extra_offset;
 	  tree base = get_addr_base_and_unit_offset (TREE_OPERAND (op, 0),
-						     &offset);
+						     &extra_offset);
 	  if (!base)
 	    {
 	      base = get_base_address (TREE_OPERAND (op, 0));
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr114207.c b/gcc/testsuite/gcc.c-torture/execute/pr114207.c
new file mode 100644
index 00000000000..052fa85e9fc
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr114207.c
@@ -0,0 +1,23 @@ 
+#include <stdio.h>
+#include <stdint.h>
+
+struct S {
+    int a, b;
+};
+
+__attribute__((noinline))
+void foo (struct S *s) {
+    struct S ss = (struct S) {
+        .a = s->b,
+        .b = s->a
+    };
+    *s = ss;
+}
+
+int main() {
+  struct S s = {6, 12};
+  foo(&s);
+  if (s.a != 12 || s.b != 6)
+    __builtin_abort ();
+  return 0;
+}