Momchil Velikov 7360d6d921 [ARM][MachineOutliner] Do not overestimate LR liveness in return block
The `LiveRegUnits` utility (as well as `LivePhysRegs`) considers
callee-saved registers to be alive at the point after the return
instruction in a block. In the ARM backend, the `LR` register is
classified as callee-saved, which is not really correct (from an ARM
eABI or just common sense point of view).  These two conditions cause
the `MachineOutliner` to overestimate the liveness of `LR`, which
results in unnecessary saves/restores of `LR` around calls to outlined
sequences.  It also causes the `MachineVerifer` to crash in some
cases, because the save instruction reads a dead `LR`, for example
when the following program:

int h(int, int);

int f(int a, int b, int c, int d) {
  a = h(a + 1, b - 1);
  b = b + c;
  return 1 + (2 * a + b) * (c - d) / (a - b) * (c + d);
}

int g(int a, int b, int c, int d) {
  a = h(a - 1, b + 1);
  b = b + c;
  return 2 + (2 * a + b) * (c - d) / (a - b) * (c + d);
}

is compiled with `-target arm-eabi -march=armv7-m -Oz`.

This patch computes the liveness of `LR` in return blocks only, while
taking into account the few ARM instructions, which read `LR`, but
nevertheless the register is not mentioned (explicitly or implicitly)
in the instruction operands.

Differential Revision: https://reviews.llvm.org/D89189
2020-11-02 16:47:22 +00:00
..
2019-05-15 12:41:58 +00:00
2017-08-01 22:20:49 +00:00
2017-08-28 20:20:47 +00:00
2020-01-07 16:51:11 +00:00
2020-06-18 17:26:24 +01:00
2019-08-01 11:12:10 +00:00
2020-02-24 14:19:21 +00:00
2020-05-14 16:46:16 +01:00
2018-10-14 16:49:04 +00:00
2020-07-16 11:25:53 +01:00
2018-07-04 13:28:39 +00:00
2019-10-08 08:25:42 +00:00
2020-04-09 10:36:00 +01:00
2019-01-07 12:21:13 +00:00
2019-02-26 12:02:12 +00:00
2019-12-12 13:51:39 +00:00
2019-06-11 11:09:25 +00:00
2017-12-11 12:13:45 +00:00
2017-12-11 12:13:45 +00:00
2017-12-11 12:13:45 +00:00
2018-09-26 10:56:00 +00:00
2020-03-31 10:11:36 +01:00
2019-10-08 16:16:26 +00:00
2019-07-29 09:48:07 +00:00
2020-02-20 13:54:43 +00:00
2017-08-28 20:20:47 +00:00
2017-08-01 22:20:49 +00:00
2017-08-01 22:20:49 +00:00
2020-01-21 10:40:17 +00:00
2019-07-27 18:44:15 +00:00
2020-07-16 11:25:53 +01:00
2019-10-08 08:25:42 +00:00
2020-10-07 11:47:03 +01:00
2019-11-04 13:37:01 +00:00
2019-10-08 08:25:42 +00:00
2020-07-16 11:25:53 +01:00