]> git.ipfire.org Git - people/ms/gcc.git/commit
ifcvt: Don't introduce trapping or faulting reads in noce_try_sign_mask [PR106032]
authorJakub Jelinek <jakub@redhat.com>
Tue, 21 Jun 2022 09:40:16 +0000 (11:40 +0200)
committerJakub Jelinek <jakub@redhat.com>
Fri, 4 Nov 2022 08:29:30 +0000 (09:29 +0100)
commitfe6e8a09a5338c0acda23ab2d3ef4433fb83637f
tree64df39a30bd25fcc885ac55b028c5a1c79827c6c
parentd9b72d8d03134813d5fa84cffb190027fd29f6d6
ifcvt: Don't introduce trapping or faulting reads in noce_try_sign_mask [PR106032]

noce_try_sign_mask as documented will optimize
  if (c < 0)
    x = t;
  else
    x = 0;
into x = (c >> bitsm1) & t;
The optimization is done if either t is unconditional
(e.g. for
  x = t;
  if (c >= 0)
    x = 0;
) or if it is cheap.  We already check that t doesn't have side-effects,
but if t is conditional, we need to punt also if it may trap or fault,
as we make it unconditional.

I've briefly skimmed other noce_try* optimizations and didn't find one that
would suffer from the same problem.

2022-06-21  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/106032
* ifcvt.c (noce_try_sign_mask): Punt if !t_unconditional, and
t may_trap_or_fault_p, even if it is cheap.

* gcc.c-torture/execute/pr106032.c: New test.

(cherry picked from commit a0c30fe3b888f20215f3e040d21b62b603804ca9)
gcc/ifcvt.c
gcc/testsuite/gcc.c-torture/execute/pr106032.c [new file with mode: 0644]