aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgexpand.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-12-01 00:03:18 +1030
committerAlan Modra <amodra@gcc.gnu.org>2018-12-01 00:03:18 +1030
commitceb8c8c4cae47fd07cd7dda74bb31b98ce4adadc (patch)
tree23089fda67e1747910ad9f2b45f26840fed7944e /gcc/cfgexpand.c
parentf44697b78a06bf880ba25e9d4cd721f24282a797 (diff)
downloadgcc-ceb8c8c4cae47fd07cd7dda74bb31b98ce4adadc.zip
gcc-ceb8c8c4cae47fd07cd7dda74bb31b98ce4adadc.tar.gz
gcc-ceb8c8c4cae47fd07cd7dda74bb31b98ce4adadc.tar.bz2
[RS6000] num_insns_constant ICE
This patch came about from investigating an ICE that appeared when I was retesting an old half-baked patch of mine to rs6000_rtx_costs. If a const_double is fed to rs6000_is_valid_and_mask and from there to rs6000_is_valid_mask where INTVAL is used, gcc will ICE. The num_insns_constant ICE was introduced with git commit f337168d97. However, the code was buggy before that. There was no point in testing for a mask since the mask predicates only handle const_int. In fact, I don't think the function ever handled floating point constants that might match a load of minus one and mask. It does now. I've added a few comments regarding splitters so the next person looking at this code can see how this works. The patch also extracts code out of num_insns_constant that needed to handle multiple gprs for DFmode constants in 32-bit mode, to a function that handles multiple gprs a little more generally. I don't think there is any need for anything but the 32-bit DFmode case currently, but this allows for possible future uses. The CONST_WIDE_INT case is also not used currently, and needed fixing. Adding CONST_WIDE_INT_NUNITS - 1 only makes sense if the elements of the array were being shifted into a register of size larger than the element size (which is 64-bits). * config/rs6000/rs6000.c (num_insns_constant_gpr): Renamed from num_insns_constant_wide. Make static. Revise comment. (num_insns_constant_multi): New function. (num_insns_constant): Formatting. Correct CONST_WIDE_INT calculation. Simplify and extract code common to both CONST_INT and CONST_DOUBLE. Add gcc_unreachable for unhandled const_double modes. * config/rs6000/rs6000-protos.h (num_insns_const_wide): Delete. From-SVN: r266662
Diffstat (limited to 'gcc/cfgexpand.c')
0 files changed, 0 insertions, 0 deletions