aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/constexpr.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2020-08-09 23:14:58 +0100
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 15:07:51 -0300
commit00c3859fdcd022681f02c329d0349bdb483c124f (patch)
tree7ea08f60c0657892d71cd2d47e22bd6e752a8216 /gcc/cp/constexpr.c
parent34533193a4f11667041a5c3154109a68881b4ce0 (diff)
downloadgcc-00c3859fdcd022681f02c329d0349bdb483c124f.zip
gcc-00c3859fdcd022681f02c329d0349bdb483c124f.tar.gz
gcc-00c3859fdcd022681f02c329d0349bdb483c124f.tar.bz2
middle-end: Correct calculation of mul_widen_cost and mul_highpart_cost.
This patch fixes a subtle bug in the depths of GCC's synth_mult, where the middle-end queries whether (how well) the target supports widening and highpart multiplications by calling targetm.rtx_costs. The code in init_expmed and init_expmed_one_mode iterates over various RTL patterns querying the cost of each. To avoid generating & garbage collecting too much junk, it reuses the same RTL over and over, but adjusting the modes between each call. Alas this reuse of state is a little fragile, and at some point a change to init_expmed_one_conv has resulted in the state (mode of a register) being changed, but not reset before being used again. Using the old software engineering/defensive programming maxim of "why fix a bug just once, if it can be fixed in multiple places", this patch both restores the original value in init_expmed_one_conv, and also sets it to the expected value in init_expmed_one_mode. This should hopefully signal the need to be careful of invariants for anyone modifying this code in future. 2020-08-09 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog * expmed.c (init_expmed_one_conv): Restore all->reg's mode. (init_expmed_one_mode): Set all->reg to desired mode. gcc/testsuite/ChangeLog PR target/71321 * gcc.target/i386/pr71321.c: Check that the code doesn't use the 4B zero displacement lea, not that it uses lea.
Diffstat (limited to 'gcc/cp/constexpr.c')
0 files changed, 0 insertions, 0 deletions