testcase: Add testcase for tree-optimization/117341

Message ID 20241029050804.896741-1-quic_apinski@quicinc.com
State Committed
Commit 17f6add3aba96681673b78862116a85d619cd806
Headers
Series testcase: Add testcase for tree-optimization/117341 |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Test passed

Commit Message

Andrew Pinski Oct. 29, 2024, 5:08 a.m. UTC
  Even though PR 117341 was a duplicate of PR 116768, another
testcase this time C++ does not hurt to have.
The testcase is a self-contained and does not use directly libstdc++
except for operator new (it does not even call delete).

Tested on x86_64-linux-gnu with it working.

	PR tree-optimization/117341

gcc/testsuite/ChangeLog:

	* g++.dg/torture/pr117341-1.C: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
---
 gcc/testsuite/g++.dg/torture/pr117341-1.C | 54 +++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/torture/pr117341-1.C
  

Comments

Jeff Law Oct. 29, 2024, 1:50 p.m. UTC | #1
On 10/28/24 11:08 PM, Andrew Pinski wrote:
> Even though PR 117341 was a duplicate of PR 116768, another
> testcase this time C++ does not hurt to have.
> The testcase is a self-contained and does not use directly libstdc++
> except for operator new (it does not even call delete).
> 
> Tested on x86_64-linux-gnu with it working.
> 
> 	PR tree-optimization/117341
> 
> gcc/testsuite/ChangeLog:
> 
> 	* g++.dg/torture/pr117341-1.C: New test.
OK
jeff
  

Patch

diff --git a/gcc/testsuite/g++.dg/torture/pr117341-1.C b/gcc/testsuite/g++.dg/torture/pr117341-1.C
new file mode 100644
index 00000000000..b13d2502e35
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr117341-1.C
@@ -0,0 +1,54 @@ 
+void swap(long &a, long &b)
+{
+  long t = a;
+  a = b;
+  b = t;
+}
+
+struct Array {
+    long arr[1];
+    Array() : arr() {}
+    /* Operators */
+    long& operator[](int index) { return arr[index]; }
+    const long& operator[](int index) const { return arr[index]; }
+    /* Operations */
+    void swap(Array& array)  {
+        for (int i = 0; i < 1; ++i)
+            ::swap(arr[i], array[i]);
+    }
+};
+
+class Vector : public Array {};
+
+struct v
+{
+  Vector *e;
+  v() : e (new Vector[4]){}
+  Vector& operator[](int index) { return e[index]; }
+  const Vector& operator[](int index) const { return e[index]; }
+};
+static inline Vector func(const Vector& y)
+{
+        return y;
+}
+
+volatile int a;
+
+int main() {
+    v solution;
+    solution[0][0] = 1;
+    int t = a;
+    for (int i = 0; i < 3; ++i) {
+        const Vector& v = solution[i];
+        Vector sum;
+        const long delta = func(v)[0] & t;
+        sum[0] = v[0] + delta;
+        solution[i + 1].swap(sum);
+    }
+    for(int i = 0; i < 4; i++)
+    {
+      if (solution[i][0] != 1)
+        __builtin_abort();
+    }
+    return 0;
+}