From f1c8e23302807847f11390aca88581d526b6efa7 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Tue, 15 Mar 2016 03:10:31 +0000 Subject: [PATCH] Backport PR69941 patch from mainline. PR rtl-optimization/69941 * postreload.c (reload_combine_recognize_pattern): Ensure all uses of the reg share its mode. PR rtl-optimization/69941 * gcc.dg/torture/pr69941.c: New test. From-SVN: r234209 --- gcc/ChangeLog | 9 ++++++++ gcc/postreload.c | 18 ++++++++++++---- gcc/testsuite/ChangeLog | 8 +++++++ gcc/testsuite/gcc.dg/torture/pr69941.c | 30 ++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr69941.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c626a6f9d526..1225cac52f7a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-03-15 Bernd Schmidt + + Backport from mainline + 2016-03-04 Bernd Schmidt + + PR rtl-optimization/69941 + * postreload.c (reload_combine_recognize_pattern): Ensure all uses of + the reg share its mode. + 2016-03-14 Rainer Orth Backport from mainline: diff --git a/gcc/postreload.c b/gcc/postreload.c index 9bfffe5f4df4..1e852cdde043 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -1094,7 +1094,6 @@ static bool reload_combine_recognize_pattern (rtx insn) { rtx set, reg, src; - unsigned int regno; set = single_set (insn); if (set == NULL_RTX) @@ -1106,7 +1105,20 @@ reload_combine_recognize_pattern (rtx insn) || hard_regno_nregs[REGNO (reg)][GET_MODE (reg)] != 1) return false; - regno = REGNO (reg); + unsigned int regno = REGNO (reg); + machine_mode mode = GET_MODE (reg); + + if (reg_state[regno].use_index < 0 + || reg_state[regno].use_index >= RELOAD_COMBINE_MAX_USES) + return false; + + for (int i = reg_state[regno].use_index; + i < RELOAD_COMBINE_MAX_USES; i++) + { + struct reg_use *use = reg_state[regno].reg_use + i; + if (GET_MODE (*use->usep) != mode) + return false; + } /* Look for (set (REGX) (CONST_INT)) (set (REGX) (PLUS (REGX) (REGY))) @@ -1128,8 +1140,6 @@ reload_combine_recognize_pattern (rtx insn) && REG_P (XEXP (src, 1)) && rtx_equal_p (XEXP (src, 0), reg) && !rtx_equal_p (XEXP (src, 1), reg) - && reg_state[regno].use_index >= 0 - && reg_state[regno].use_index < RELOAD_COMBINE_MAX_USES && last_label_ruid < reg_state[regno].use_ruid) { rtx base = XEXP (src, 1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 60cb3d7075ef..d75573b994a8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-03-15 Bernd Schmidt + + Backport from mainline + 2016-03-04 Bernd Schmidt + + PR rtl-optimization/69941 + * gcc.dg/torture/pr69941.c: New test. + 2016-03-14 Dominique d'Humieres PR fortran/45076 diff --git a/gcc/testsuite/gcc.dg/torture/pr69941.c b/gcc/testsuite/gcc.dg/torture/pr69941.c new file mode 100644 index 000000000000..f15d41a819f3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69941.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ + +int a = 0; +int b = 0; +int c = 0; +int e = 0; +int f = 0; +int *g = &e; + +int fn1() { return b ? a : b; } + +int main() { + int h = fn1() <= 0x8000000000000000ULL; // h = 1; + + int k = f; // k = 0; + + long i = h ? k : k / h; // i = 0; + + long l = (unsigned short)(i - 0x1800); // l = 0xe800 + + i = l ? l : c; // i = 0xe800; + + *g = i; // *g = 0xe800; e = 0xe800; + + unsigned char result = e >> 9; // result = 0x74; + + if ((int)result != 0x74) + __builtin_abort (); + return 0; +} -- 2.47.2