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.
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),
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),
--- /dev/null
+begin proc fixed = (int v, int width, after) string: skip;
+ int x = 2, y = 3;
+ fixed (SIGN (x * y), 0, 0)
+end
--- /dev/null
+begin proc fixed = (int v, int width, after) string: skip;
+ real x = 2, y = 3;
+ fixed (SIGN (x * y), 0, 0)
+end