From: Richard Biener Date: Fri, 30 Jan 2026 14:32:39 +0000 (+0100) Subject: middle-end/123887 - trapping conditional operand turned unconditional X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1fa15791ae458e1bd8db6842dfc021230521a65;p=thirdparty%2Fgcc.git middle-end/123887 - trapping conditional operand turned unconditional The following properly checks expr_no_side_effects_p on two patterns that turns a conditionally evaluated operand into unconditonal. PR middle-end/123887 * match.pd ((zero_one ==/!= 0) ? .. z y .. -> zero_one * z ..): Check evaluating z unconditionally has no side-effects, like trapping. * gcc.dg/torture/pr123887.c: New testcase. --- diff --git a/gcc/match.pd b/gcc/match.pd index 05e8ea7a229..9b2da2be4c5 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -5178,7 +5178,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (op:c @2 @1)) (if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) > 1 - && (INTEGRAL_TYPE_P (TREE_TYPE (@0)))) + && INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && expr_no_side_effects_p (@2)) (op (mult (convert:type @0) @2) @1)))) /* (zero_one != 0) ? z y : y -> ((typeof(y))zero_one * z) y */ @@ -5190,7 +5191,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) @1) (if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) > 1 - && (INTEGRAL_TYPE_P (TREE_TYPE (@0)))) + && INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && expr_no_side_effects_p (@2)) (op (mult (convert:type @0) @2) @1)))) /* ?: Value replacement. */ diff --git a/gcc/testsuite/gcc.dg/torture/pr123887.c b/gcc/testsuite/gcc.dg/torture/pr123887.c new file mode 100644 index 00000000000..c2a9659c5b5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr123887.c @@ -0,0 +1,14 @@ +/* { dg-do run } */ + +typedef struct { + unsigned s; +} struct_t; + +struct_t *p; +bool cond; +int v = 1; +int main() +{ + int u = 1 + (cond ? p->s : 0); + return u - v; +}