From 2a07345c4f8dabc286fc470e76c53473e5bc3eb7 Mon Sep 17 00:00:00 2001 From: "Vladimir N. Makarov" Date: Fri, 31 Jan 2020 14:26:26 -0500 Subject: [PATCH] Fix for PR 91333 - suboptimal register allocation for inline asm 2020-01-31 Vladimir Makarov PR rtl-optimization/91333 * ira-color.c (bucket_allocno_compare_func): Move conflict hard reg preferences comparison up. 2020-01-31 Vladimir Makarov PR rtl-optimization/91333 * gcc.target/i386/pr91333.c: New. --- gcc/ChangeLog | 6 ++++++ gcc/ira-color.c | 10 +++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/pr91333.c | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr91333.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 234e328..e4a3efd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-01-31 Vladimir Makarov + + PR rtl-optimization/91333 + * ira-color.c (bucket_allocno_compare_func): Move conflict hard + reg preferences comparison up. + 2020-01-31 Richard Sandiford * config/aarch64/aarch64.h (TARGET_SVE_BF16): New macro. diff --git a/gcc/ira-color.c b/gcc/ira-color.c index 4a726dc..51c4afd 100644 --- a/gcc/ira-color.c +++ b/gcc/ira-color.c @@ -2251,6 +2251,11 @@ bucket_allocno_compare_func (const void *v1p, const void *v2p) ira_allocno_t t2 = ALLOCNO_COLOR_DATA (a2)->first_thread_allocno; int cl1 = ALLOCNO_CLASS (a1), cl2 = ALLOCNO_CLASS (a2); + /* Push allocnos with minimal conflict_allocno_hard_prefs first. */ + pref1 = ALLOCNO_COLOR_DATA (a1)->conflict_allocno_hard_prefs; + pref2 = ALLOCNO_COLOR_DATA (a2)->conflict_allocno_hard_prefs; + if ((diff = pref1 - pref2) != 0) + return diff; freq1 = ALLOCNO_COLOR_DATA (t1)->thread_freq; freq2 = ALLOCNO_COLOR_DATA (t2)->thread_freq; if ((diff = freq1 - freq2) != 0) @@ -2276,11 +2281,6 @@ bucket_allocno_compare_func (const void *v1p, const void *v2p) a2_num = ALLOCNO_COLOR_DATA (a2)->available_regs_num; if ((diff = a2_num - a1_num) != 0) return diff; - /* Push allocnos with minimal conflict_allocno_hard_prefs first. */ - pref1 = ALLOCNO_COLOR_DATA (a1)->conflict_allocno_hard_prefs; - pref2 = ALLOCNO_COLOR_DATA (a2)->conflict_allocno_hard_prefs; - if ((diff = pref1 - pref2) != 0) - return diff; return ALLOCNO_NUM (a2) - ALLOCNO_NUM (a1); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cce52ea..556e5fb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-31 Vladimir Makarov + + PR rtl-optimization/91333 + * gcc.target/i386/pr91333.c: New. + 2020-01-31 David Malcolm PR analyzer/93379 diff --git a/gcc/testsuite/gcc.target/i386/pr91333.c b/gcc/testsuite/gcc.target/i386/pr91333.c new file mode 100644 index 0000000..41fc328 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr91333.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target x86_64-*-* } } */ +/* { dg-options "-O2 -mavx" } */ +/* { dg-final { scan-assembler-times "vmovapd" 2 } } */ + +static inline double g (double x){ + asm volatile ("" : "+x" (x)); + return x; +} +static inline double f (double a, double b){ + return g (g (a) + g (b)); +} +double h (double a, double b){ + return f (f (a, a), f (b, b)); +} -- 2.7.4