This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] x86: Disable jump tables when retpolines are used (PR target/86952).
On 3/7/19 9:54 AM, Uros Bizjak wrote:
> On Thu, Mar 7, 2019 at 9:45 AM Martin Liška <mliska@suse.cz> wrote:
>>
>> Hi.
>>
>> Thanks to Intel guys, we've done some re-measurement in PR86952
>> about usage of jump tables when retpolines are used.
>> Numbers prove that disabling of JT should be the best for now.
>>
>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>
>> Ready to be installed?
>> Thanks,
>> Martin
>
> Please add a comment above your change.
Sure, should be improved.
Martin
>
> Uros.
>
>>
>> gcc/ChangeLog:
>>
>> 2019-03-06 Martin Liska <mliska@suse.cz>
>>
>> PR target/86952
>> * config/i386/i386.c (ix86_option_override_internal): Disable
>> jump tables when retpolines are used.
>>
>> gcc/testsuite/ChangeLog:
>>
>> 2019-03-06 Martin Liska <mliska@suse.cz>
>>
>> PR target/86952
>> * gcc.target/i386/pr86952.c: New test.
>> * gcc.target/i386/indirect-thunk-7.c: Use jump tables to match
>> scanned pattern.
>> * gcc.target/i386/indirect-thunk-inline-7.c: Likewise.
>> ---
>> gcc/config/i386/i386.c | 4 ++++
>> .../gcc.target/i386/indirect-thunk-7.c | 2 +-
>> .../gcc.target/i386/indirect-thunk-inline-7.c | 2 +-
>> gcc/testsuite/gcc.target/i386/pr86952.c | 23 +++++++++++++++++++
>> 4 files changed, 29 insertions(+), 2 deletions(-)
>> create mode 100644 gcc/testsuite/gcc.target/i386/pr86952.c
>>
>>
>From 54a0f3ed784c05bef0bdddcc6ae4e8677307d989 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Wed, 6 Mar 2019 13:05:50 +0100
Subject: [PATCH] x86: Disable jump tables when retpolines are used (PR
target/86952).
Jump tables are implement on x86_64 with:
jmp *.L4(,%rdi,8)
where L4 contains list of labels where to jump. When using retpolines,
the instruction is replaced with:
movq .L4(,%rdi,8), %rax
jmp *%rax
which bypasses/confuses indirect branch predictor and it's slow. In that
case, a decision tree based on if condition is faster.
gcc/ChangeLog:
2019-03-06 Martin Liska <mliska@suse.cz>
PR target/86952
* config/i386/i386.c (ix86_option_override_internal): Disable
jump tables when retpolines are used.
gcc/testsuite/ChangeLog:
2019-03-06 Martin Liska <mliska@suse.cz>
PR target/86952
* gcc.target/i386/pr86952.c: New test.
* gcc.target/i386/indirect-thunk-7.c: Use jump tables to match
scanned pattern.
* gcc.target/i386/indirect-thunk-inline-7.c: Likewise.
---
gcc/config/i386/i386.c | 4 ++++
.../gcc.target/i386/indirect-thunk-7.c | 2 +-
.../gcc.target/i386/indirect-thunk-inline-7.c | 2 +-
gcc/testsuite/gcc.target/i386/pr86952.c | 23 +++++++++++++++++++
4 files changed, 29 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/i386/pr86952.c
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index c8f9957163b..37fe41260dd 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -4894,6 +4894,10 @@ ix86_option_override_internal (bool main_args_p,
opts->x_param_values,
opts_set->x_param_values);
+ if (ix86_indirect_branch != indirect_branch_keep
+ && !opts_set->x_flag_jump_tables)
+ opts->x_flag_jump_tables = 0;
+
return true;
}
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
index 3c72036dbaf..53868f46558 100644
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic -fjump-tables" } */
void func0 (void);
void func1 (void);
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
index ea009245a58..e6f064959a1 100644
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic -fjump-tables" } */
void func0 (void);
void func1 (void);
diff --git a/gcc/testsuite/gcc.target/i386/pr86952.c b/gcc/testsuite/gcc.target/i386/pr86952.c
new file mode 100644
index 00000000000..3ff3e354878
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr86952.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mindirect-branch=thunk -fdump-tree-switchlower1" } */
+
+int global;
+
+int
+foo (int x)
+{
+ switch (x & 7)
+ {
+ case 0: ; return 1722;
+ case 1: global += 1; return 1060;
+ case 2: ; return 1990;
+ case 3: ; return 1242;
+ case 4: ; return 1466;
+ case 5: ; return 894;
+ case 6: ; return 570;
+ case 7: ; return 572;
+ default: return 0;
+ }
+}
+
+/* { dg-final { scan-tree-dump ";; GIMPLE switch case clusters: 1 2 3 4 5 6 7" "switchlower1" } } */
--
2.21.0