diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b75ac74e73a3..7678776c3445 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-03-25 Richard Sandiford <richard.sandiford@arm.com> + + PR target/94254 + * config/rs6000/rs6000.c (rs6000_can_change_mode_class): Allow + FPRs to change between SDmode and DDmode. + 2020-03-25 Martin Sebor <msebor@redhat.com> PR tree-optimization/94131 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 7505a0e1e8e1..5b36593bfb71 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -12307,6 +12307,15 @@ rs6000_can_change_mode_class (machine_mode from, if (!BYTES_BIG_ENDIAN && (to == TDmode || from == TDmode)) return false; + /* Allow SD<->DD changes, since SDmode values are stored in + the low half of the DDmode, just like target-independent + code expects. We need to allow at least SD->DD since + rs6000_secondary_memory_needed_mode asks for that change + to be made for SD reloads. */ + if ((to == DDmode && from == SDmode) + || (to == SDmode && from == DDmode)) + return true; + if (from_size < 8 || to_size < 8) return false;