From d44dc131f48254fccc69ec4178fec030e0e2761d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 22 Feb 2022 10:43:13 +0100 Subject: [PATCH] ranger: Fix up REALPART_EXPR/IMAGPART_EXPR handling [PR104604] The following testcase is miscompiled since r12-3328. That change assumed that if rhs1 of a GIMPLE_ASSIGN is COMPLEX_CST, then that is the value of the lhs of the stmt, but that is not the case always, only if it is a GIMPLE_SINGLE_RHS stmt. If it is e.g. GIMPLE_UNARY_RHS or GIMPLE_BINARY_RHS (the latter happens in the testcase), then it can be e.g. __complex__ (3, 0) / var and the REALPART_EXPR of that isn't 3, but the realpart of the division. I assume once the ranger can do complex numbers adjust_*part_expr will just fetch one or the other range from a underlying complex range, but until then, we should limit this to what r12-3328 meant to do. 2022-02-22 Jakub Jelinek PR tree-optimization/104604 * gimple-range-fold.cc (adjust_imagpart_expr, adjust_realpart_expr): Only check if gimple_assign_rhs1 is COMPLEX_CST if gimple_assign_rhs_code is COMPLEX_CST. * gcc.c-torture/execute/pr104604.c: New test. --- gcc/gimple-range-fold.cc | 6 +++-- gcc/testsuite/gcc.c-torture/execute/pr104604.c | 34 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr104604.c diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc index 2fc8376..dfacf6f 100644 --- a/gcc/gimple-range-fold.cc +++ b/gcc/gimple-range-fold.cc @@ -397,7 +397,8 @@ adjust_imagpart_expr (irange &res, const gimple *stmt) } return; } - if (is_gimple_assign (def_stmt)) + if (is_gimple_assign (def_stmt) + && gimple_assign_rhs_code (def_stmt) == COMPLEX_CST) { tree cst = gimple_assign_rhs1 (def_stmt); if (TREE_CODE (cst) == COMPLEX_CST) @@ -422,7 +423,8 @@ adjust_realpart_expr (irange &res, const gimple *stmt) if (!SSA_NAME_DEF_STMT (name)) return; - if (is_gimple_assign (def_stmt)) + if (is_gimple_assign (def_stmt) + && gimple_assign_rhs_code (def_stmt) == COMPLEX_CST) { tree cst = gimple_assign_rhs1 (def_stmt); if (TREE_CODE (cst) == COMPLEX_CST) diff --git a/gcc/testsuite/gcc.c-torture/execute/pr104604.c b/gcc/testsuite/gcc.c-torture/execute/pr104604.c new file mode 100644 index 0000000..c937e17 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr104604.c @@ -0,0 +1,34 @@ +/* PR tree-optimization/104604 */ + +unsigned char g; + +__attribute__((noipa)) +unsigned char +foo (_Complex unsigned c) +{ + unsigned char v = g; + _Complex unsigned t = 3; + t /= c; + return v + t; +} + +__attribute__((noipa)) +unsigned char +bar (_Complex unsigned c) +{ + unsigned char v = g; + _Complex unsigned t = 42; + t /= c; + return v + t; +} + +int +main () +{ + unsigned char x = foo (7); + if (x) + __builtin_abort (); + if (bar (7) != 6) + __builtin_abort (); + return 0; +} -- 2.7.4