This is a test case that fell out from our work to make the SH backend work
with LRA. Currently passes with no LRA and fails with LRA due to a reload
cycle.
Best regards,
Oleg Endo
gcc/testsuite/ChangeLog:
PR target/55212
* gcc.target/sh/torture/pr55212-c464-1.c: New.
* gcc.target/sh/torture/pr55212-c464-2.c: New.
From 82bccaca92843f0a823d5490d5764de69c291e6e Mon Sep 17 00:00:00 2001
From: Oleg Endo <[email protected]>
Date: Sun, 28 Jun 2026 18:07:45 +0900
Subject: [PATCH] SH: Add reduced test case from PR55212 c#464 / att. 62360
gcc/testsuite/ChangeLog:
PR target/55212
* gcc.target/sh/torture/pr55212-c464-1.c: New.
* gcc.target/sh/torture/pr55212-c464-2.c: New.
---
gcc/testsuite/gcc.target/sh/torture/pr55212-c464-1.c | 43 +++++++++++++++++++++++++++++++++++++++++++
gcc/testsuite/gcc.target/sh/torture/pr55212-c464-2.c | 37 +++++++++++++++++++++++++++++++++++++
2 files changed, 80 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/sh/torture/pr55212-c464-1.c
create mode 100644 gcc/testsuite/gcc.target/sh/torture/pr55212-c464-2.c
diff --git a/gcc/testsuite/gcc.target/sh/torture/pr55212-c464-1.c b/gcc/testsuite/gcc.target/sh/torture/pr55212-c464-1.c
new file mode 100644
index 0000000..d8b11c1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sh/torture/pr55212-c464-1.c
@@ -0,0 +1,43 @@
+/* { dg-additional-options "-std=c23 -m4 -mfsca -ffast-math" } */
+/* { dg-do compile } */
+
+typedef float vec3[3];
+typedef float vec4[4];
+typedef vec4 mat4[4];
+
+float glm_rotate_make_angle, glm_rotate_make___trans_tmp_1, glm_rotate_at_m_2_1,
+ glm_rotate_at_m_1_1, glm_rotate_at_m_0_0, glm_rotate_at_m_0_3,
+ glm_rotate_at_m_2_3, glm_rotate_at_pivot;
+vec3 glm_rotate_make_vs;
+
+vec4 *glm_rotate_at_m;
+
+inline void glm_rotate_make (mat4 m)
+{
+ float vs_2;
+ glm_rotate_make___trans_tmp_1 = __builtin_sinf (glm_rotate_make_angle);
+ float *dest = glm_rotate_make_vs;
+ dest[0] = glm_rotate_make___trans_tmp_1;
+ m[0][2] -= vs_2 += glm_rotate_make_vs[0];
+}
+
+void glmc_rotate_at (void)
+{
+ __attribute((aligned(8))) vec3 pivotInv;
+ float *v = &glm_rotate_at_pivot, *dest = glm_rotate_at_m[3];
+ dest[3] += glm_rotate_at_m[1][3] * v[1];
+ dest[3] += glm_rotate_at_m_2_3 * v[2];
+ {
+ __attribute((aligned(16))) mat4 rot;
+ glm_rotate_make(rot);
+ vec4 *dest = glm_rotate_at_m;
+ float a03 = glm_rotate_at_m_0_3, b10 = rot[1][0], b11 = rot[1][1];
+ dest[0][1] = glm_rotate_at_m_0_0 + glm_rotate_at_m_1_1 * rot[0][1] +
+ glm_rotate_at_m_2_1 * rot[0][2];
+ dest[1][3] = a03 * b10 * b11;
+ }
+ {
+ dest[3] += glm_rotate_at_m_1_1;
+ dest[3] += pivotInv[2];
+ }
+}
diff --git a/gcc/testsuite/gcc.target/sh/torture/pr55212-c464-2.c b/gcc/testsuite/gcc.target/sh/torture/pr55212-c464-2.c
new file mode 100644
index 0000000..6f21006
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sh/torture/pr55212-c464-2.c
@@ -0,0 +1,37 @@
+/* { dg-additional-options "-std=c23 -m4 -mfsca -ffast-math" } */
+/* { dg-do compile } */
+
+
+typedef float vec4[4];
+typedef vec4 mat4[4];
+float glm_mul_rot_m1_2_2, glm_mul_rot_m1_1_2, glm_mul_rot_m1_0_2,
+ glm_mul_rot_m1_3_3, glm_mul_rot_m1_3_2, glm_mul_rot_m1_3_1,
+ glm_mul_rot_m1_3_0, glm_mul_rot_m1_2_1, glm_mul_rot_m1_2_0,
+ glm_mul_rot_dest_3_3, glm_mul_rot_dest_3_2, glm_mul_rot_dest_3_1,
+ glm_mul_rot_dest_3_0, glm_mul_rot_dest_2_3, glm_mul_rot_dest_1_2,
+ glm_mul_rot_dest_1_1, glm_mul_rot_dest_1_0, glm_mul_rot_dest_0_2,
+ glm_rotate_z_angle;
+
+static void glm_mul_rot(mat4 m2) {
+ float a20 = glm_mul_rot_m1_2_0, a21 = glm_mul_rot_m1_2_1,
+ a30 = glm_mul_rot_m1_3_0, a31 = glm_mul_rot_m1_3_1,
+ a32 = glm_mul_rot_m1_3_2, a33 = glm_mul_rot_m1_3_3, b11 = m2[1][1],
+ b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2];
+ glm_mul_rot_dest_0_2 = glm_mul_rot_m1_0_2 * m2[0][0] +
+ glm_mul_rot_m1_1_2 * m2[0][1] +
+ glm_mul_rot_m1_2_2 * m2[0][2];
+ glm_mul_rot_dest_1_0 = a20;
+ glm_mul_rot_dest_1_1 = a21;
+ glm_mul_rot_dest_1_2 = b11;
+ glm_mul_rot_dest_2_3 = b20 * b21 * b22;
+ glm_mul_rot_dest_3_0 = a30;
+ glm_mul_rot_dest_3_1 = a31;
+ glm_mul_rot_dest_3_2 = a32;
+ glm_mul_rot_dest_3_3 = a33;
+}
+void glmc_rotate_z() {
+ mat4 t;
+ float s = __builtin_sinf(glm_rotate_z_angle);
+ t[0][1] = s;
+ glm_mul_rot(t);
+}
\ No newline at end of file
--
libgit2 1.9.1