]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
a68: fix a68_int_sign and a68_real_sign
authorJose E. Marchesi <jose.marchesi@oracle.com>
Tue, 9 Dec 2025 23:10:05 +0000 (00:10 +0100)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Wed, 10 Dec 2025 16:21:37 +0000 (17:21 +0100)
This commit fixes the lowerer for `sign' operator for ints and reals
to not gimplify its operand twice.

Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog

* a68-low-ints.cc (a68_int_sign): Avoid gimplifying val twice.
* a68-low-reals.cc (a68_real_sign): Likewise.

gcc/testsuite/ChangeLog

* algol68/execute/sign-int-2.a68: New test.
* algol68/execute/sign-real-2.a68: Likewise.

gcc/algol68/a68-low-ints.cc
gcc/algol68/a68-low-reals.cc
gcc/testsuite/algol68/execute/sign-int-2.a68 [new file with mode: 0644]
gcc/testsuite/algol68/execute/sign-real-2.a68 [new file with mode: 0644]

index d119de9a56bcdce00fc68e07a7628d1e41179695..07b51e51d089d8f691b2389db8c48f4a63e983df 100644 (file)
@@ -109,6 +109,7 @@ tree
 a68_int_sign (tree val)
 {
   tree zero = build_int_cst (TREE_TYPE (val), 0);
+  val = save_expr (val);
   return fold_build3 (COND_EXPR,
                      a68_int_type,
                      fold_build2 (EQ_EXPR, integer_type_node, val, zero),
index ab0064a4855b2f3354cc762e6634d289e538db5f..adb0257d6ff66751a16ea5508a58d4f9b0570109 100644 (file)
@@ -165,6 +165,7 @@ tree
 a68_real_sign (tree val)
 {
   tree zero = build_real (TREE_TYPE (val), dconst0);
+  val = save_expr (val);
   return fold_build3 (COND_EXPR,
                      a68_int_type,
                      build2 (EQ_EXPR, integer_type_node, val, zero),
diff --git a/gcc/testsuite/algol68/execute/sign-int-2.a68 b/gcc/testsuite/algol68/execute/sign-int-2.a68
new file mode 100644 (file)
index 0000000..cb728e7
--- /dev/null
@@ -0,0 +1,4 @@
+begin proc fixed = (int v, int width, after) string: skip;
+      int x = 2, y = 3;
+      fixed (SIGN (x * y), 0, 0)
+end
diff --git a/gcc/testsuite/algol68/execute/sign-real-2.a68 b/gcc/testsuite/algol68/execute/sign-real-2.a68
new file mode 100644 (file)
index 0000000..d95897f
--- /dev/null
@@ -0,0 +1,4 @@
+begin proc fixed = (int v, int width, after) string: skip;
+      real x = 2, y = 3;
+      fixed (SIGN (x * y), 0, 0)
+end