https://gcc.gnu.org/g:8c59055f10eb6f160951bc1a3087d7a5527d0576

commit r16-6014-g8c59055f10eb6f160951bc1a3087d7a5527d0576
Author: Jose E. Marchesi <[email protected]>
Date:   Wed Dec 10 00:10:05 2025 +0100

    a68: fix a68_int_sign and a68_real_sign
    
    This commit fixes the lowerer for `sign' operator for ints and reals
    to not gimplify its operand twice.
    
    Signed-off-by: Jose E. Marchesi <[email protected]>
    
    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.

Diff:
---
 gcc/algol68/a68-low-ints.cc                   | 1 +
 gcc/algol68/a68-low-reals.cc                  | 1 +
 gcc/testsuite/algol68/execute/sign-int-2.a68  | 4 ++++
 gcc/testsuite/algol68/execute/sign-real-2.a68 | 4 ++++
 4 files changed, 10 insertions(+)

diff --git a/gcc/algol68/a68-low-ints.cc b/gcc/algol68/a68-low-ints.cc
index d119de9a56bc..07b51e51d089 100644
--- a/gcc/algol68/a68-low-ints.cc
+++ b/gcc/algol68/a68-low-ints.cc
@@ -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),
diff --git a/gcc/algol68/a68-low-reals.cc b/gcc/algol68/a68-low-reals.cc
index ab0064a4855b..adb0257d6ff6 100644
--- a/gcc/algol68/a68-low-reals.cc
+++ b/gcc/algol68/a68-low-reals.cc
@@ -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
index 000000000000..cb728e71e736
--- /dev/null
+++ b/gcc/testsuite/algol68/execute/sign-int-2.a68
@@ -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
index 000000000000..d95897f74cd4
--- /dev/null
+++ b/gcc/testsuite/algol68/execute/sign-real-2.a68
@@ -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

Reply via email to