summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2020-02-14 14:03:19 +0100
committerJan Beulich <jbeulich@suse.com>2020-02-14 14:03:19 +0100
commit92334ad2c6ad3aef4f78894c4d0f2794255317b3 (patch)
tree96c8e60b4c9261a439d9aea06ba7b123bda9d281
parent514a8bb031f64fc31a4d534249b9e3dfad171b28 (diff)
downloadbinutils-gdb-92334ad2c6ad3aef4f78894c4d0f2794255317b3.tar.gz
x86: optimize away pointless segment overrides
When optimizing there's no point keeping the segment overrides when we warn about their presence in the first place.
-rw-r--r--gas/ChangeLog9
-rw-r--r--gas/config/tc-i386.c11
-rw-r--r--gas/testsuite/gas/i386/i386.exp1
-rw-r--r--gas/testsuite/gas/i386/lea-optimize.d13
4 files changed, 31 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 4f1aeed7c7c..0cbd2a5bbff 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,4 +1,11 @@
-2020-02-XX Jan Beulich <jbeulich@suse.com>
+2020-02-14 Jan Beulich <jbeulich@suse.com>
+
+ * config/tc-i386.c (process_operands): Drop ineffectual segment
+ overrides when optimizing.
+ * testsuite/gas/i386/lea-optimize.d: New.
+ * testsuite/gas/i386/i386.exp: Run new test.
+
+2020-02-14 Jan Beulich <jbeulich@suse.com>
* config/tc-i386.c (process_operands): Also check insn prefix
for ineffectual segment override warning. Don't cover possible
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 05151f2a636..d7d45de76e0 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -7165,10 +7165,17 @@ duplicate:
}
if ((i.seg[0] || i.prefix[SEG_PREFIX])
- && !quiet_warnings
&& i.tm.base_opcode == 0x8d /* lea */
&& !is_any_vex_encoding(&i.tm))
- as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
+ {
+ if (!quiet_warnings)
+ as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
+ if (optimize)
+ {
+ i.seg[0] = NULL;
+ i.prefix[SEG_PREFIX] = 0;
+ }
+ }
/* If a segment was explicitly specified, and the specified segment
is not the default, use an opcode prefix to select it. If we
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 147297e22f2..258fb763360 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -502,6 +502,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_list_test "optimize-6a" "-I${srcdir}/$subdir -march=+noavx -al"
run_dump_test "optimize-6b"
run_list_test "optimize-7" "-I${srcdir}/$subdir -march=+noavx2 -al"
+ run_dump_test "lea-optimize"
run_dump_test "align-branch-1a"
run_dump_test "align-branch-1b"
run_dump_test "align-branch-1c"
diff --git a/gas/testsuite/gas/i386/lea-optimize.d b/gas/testsuite/gas/i386/lea-optimize.d
new file mode 100644
index 00000000000..16e5b82daea
--- /dev/null
+++ b/gas/testsuite/gas/i386/lea-optimize.d
@@ -0,0 +1,13 @@
+#as: -O -q
+#objdump: -dw
+#name: i386 LEA-like segment overrride dropping
+#source: lea.s
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <start>:
+[ ]*[0-9a-f]+:[ ]+8d 00[ ]+lea[ ]+\(%eax\),%eax
+[ ]*[0-9a-f]+:[ ]+8d 00[ ]+lea[ ]+\(%eax\),%eax
+#pass