From 8c59055f10eb6f160951bc1a3087d7a5527d0576 Mon Sep 17 00:00:00 2001 From: "Jose E. Marchesi" Date: Wed, 10 Dec 2025 00:10:05 +0100 Subject: [PATCH] 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 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 | 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(+) create mode 100644 gcc/testsuite/algol68/execute/sign-int-2.a68 create mode 100644 gcc/testsuite/algol68/execute/sign-real-2.a68 diff --git a/gcc/algol68/a68-low-ints.cc b/gcc/algol68/a68-low-ints.cc index d119de9a56b..07b51e51d08 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 ab0064a4855..adb0257d6ff 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 00000000000..cb728e71e73 --- /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 00000000000..d95897f74cd --- /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 -- 2.47.3