tree-optimization/102659 - avoid undefined overflow after if-conversion
authorRichard Biener <rguenther@suse.de>
Mon, 11 Oct 2021 10:27:10 +0000 (12:27 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 13 Oct 2021 11:11:12 +0000 (13:11 +0200)
commit3c0194d7ff21d61c02f3c6b111c83ef24a69e1f0
tree8ffe45c73c7ed019e0f9f1eea777ed3eb47e9b9f
parent77c7abe3588d407ed820224f8d1b1a17a16831a0
tree-optimization/102659 - avoid undefined overflow after if-conversion

The following makes sure to rewrite arithmetic with undefined behavior
on overflow to a well-defined variant when moving them to be always
executed as part of doing if-conversion for loop vectorization.

2021-10-11  Richard Biener  <rguenther@suse.de>

PR tree-optimization/102659
* tree-if-conv.c (need_to_rewrite_undefined): New flag.
(if_convertible_gimple_assign_stmt_p): Mark the loop for
rewrite when stmts with undefined behavior on integer
overflow appear.
(combine_blocks): Predicate also when we need to rewrite stmts.
(predicate_statements): Rewrite affected stmts to something
with well-defined behavior on overflow.
(tree_if_conversion): Initialize need_to_rewrite_undefined.

* gcc.dg/torture/pr69760.c: Adjust the testcase.
* gcc.target/i386/avx2-vect-mask-store-move1.c: Expect to move
the conversions to unsigned as well.
gcc/testsuite/gcc.dg/torture/pr69760.c
gcc/testsuite/gcc.target/i386/avx2-vect-mask-store-move1.c
gcc/tree-if-conv.c