We fail to recurse for REALPART_EXPR and IMAGPART_EXPR causing a bad
re-write of reverse-storage-order accesses by IVOPTS.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR tree-optimization/128632
* tree-ssa-loop-ivopts.cc (may_be_nonaddressable_p): Recurse
for REALPART_EXPR and IMAGPART_EXPR base.
* gcc.dg/torture/pr128632.c: New testcase.
---
gcc/testsuite/gcc.dg/torture/pr128632.c | 14 ++++++++++++++
gcc/tree-ssa-loop-ivopts.cc | 4 ++++
2 files changed, 18 insertions(+)
create mode 100644 gcc/testsuite/gcc.dg/torture/pr128632.c
diff --git a/gcc/testsuite/gcc.dg/torture/pr128632.c
b/gcc/testsuite/gcc.dg/torture/pr128632.c
new file mode 100644
index 00000000000..2e0ee5dd206
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr128632.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+
+#pragma scalar_storage_order big-endian
+struct B { _Complex unsigned c; };
+#pragma scalar_storage_order default
+struct B g[32];
+int n = 4;
+int main()
+{
+ for (int i = 0; i < n; i++) __imag__ g[i].c = i;
+ if (__imag__ g[2].c != 2)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
index 4b5392ea354..260f8e9486b 100644
--- a/gcc/tree-ssa-loop-ivopts.cc
+++ b/gcc/tree-ssa-loop-ivopts.cc
@@ -2226,6 +2226,10 @@ may_be_nonaddressable_p (tree expr)
return true;
return may_be_nonaddressable_p (TREE_OPERAND (expr, 0));
+ case REALPART_EXPR:
+ case IMAGPART_EXPR:
+ return may_be_nonaddressable_p (TREE_OPERAND (expr, 0));
+
CASE_CONVERT:
return true;
base-commit: 1600ba65f603ec6e92583ba8aeba5c825cd7c887
prerequisite-patch-id: e52d299db98b0892f974152cd9fa5f6859fec5b7
prerequisite-patch-id: 39da6ec3264bae454fa504f127cd5b80a0662f04
prerequisite-patch-id: 6d6c263a964425334ad8c2edd4dd89dcbff44bfe
prerequisite-patch-id: 9a12a1706cbdff1edf8959682cd3cf9d900cd8f1
prerequisite-patch-id: b24057443c46d6979436cce479836178b19355de
prerequisite-patch-id: d61bf2c4249ecd3d9da5eeda002d332ed3a8b4fd
prerequisite-patch-id: 59cbeca60f782f48f945bc532c2235a50de6f0e5
prerequisite-patch-id: 8eddd3172e2007d0fc591124a56b372dfe83e683
prerequisite-patch-id: 862842dd3742066d039f66ffe9528bc490308c50
prerequisite-patch-id: e413d39d9af45f25483eaf229cf883c771444fbb
prerequisite-patch-id: 2faef186ad1d816bb104d89638bc4cec6d863a46
prerequisite-patch-id: b32cceb111f4f57798e4b1d58822281e7bbaf25e
prerequisite-patch-id: 08ff1c06921c5e253d911128be3a8ebb76137d3c
prerequisite-patch-id: 72aa7ba47bd81909871a9e1a2e9de14f2cf42174
prerequisite-patch-id: 2ce10434bf0a7ab22e27ff177073e10b4b7d0d72
prerequisite-patch-id: e286b2e30887f3f43a3458c7c9b3f8c8b513a91b
prerequisite-patch-id: dc07b9957107f8b453a87ad64fd8477ae26e370c
prerequisite-patch-id: 146a9a34e1f46284793e3329e70d1d689efb4145
prerequisite-patch-id: fd2a357c32e58df9d7f99dfa559891d56ebf5a5e
prerequisite-patch-id: 438f2a1abf825f7fa7c9c6b95902c38a5bc434e5
--
2.51.0