aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2018-01-10 16:13:07 +0100
committerSegher Boessenkool <segher@gcc.gnu.org>2018-01-10 16:13:07 +0100
commit8c6e19c1c24794163bc9114bb367c9d61b7f839c (patch)
tree5f267bfaade3241d4a715ef843334ee0deba267d /gcc
parentc9edeca8b88d20afa80143302be64e2e625e707a (diff)
downloadgcc-8c6e19c1c24794163bc9114bb367c9d61b7f839c.zip
gcc-8c6e19c1c24794163bc9114bb367c9d61b7f839c.tar.gz
gcc-8c6e19c1c24794163bc9114bb367c9d61b7f839c.tar.bz2
rs6000: Wrap diff of immediates in const (PR83629)
In various of our 32-bit load_toc patterns we take the difference of two immediates (labels) as a term to something bigger; but this isn't canonical RTL, it needs to be wrapped in CONST. PR target/83629 * config/rs6000/rs6000.md (load_toc_v4_PIC_2, load_toc_v4_PIC_3b, load_toc_v4_PIC_3c): Wrap const term in CONST RTL. testsuite/ PR target/83629 * gcc.target/powerpc/pr83629.c: New testcase. From-SVN: r256432
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.md26
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr83629.c9
4 files changed, 36 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01a89c72..8b5bda3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-10 Segher Boessenkool <segher@kernel.crashing.org>
+
+ PR target/83629
+ * config/rs6000/rs6000.md (load_toc_v4_PIC_2, load_toc_v4_PIC_3b,
+ load_toc_v4_PIC_3c): Wrap const term in CONST RTL.
+
2018-01-10 Richard Biener <rguenther@suse.de>
PR debug/83765
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 3d3ead4..b718e20 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -10646,27 +10646,33 @@
(define_insn "load_toc_v4_PIC_2"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r")
- (mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
- (minus:SI (match_operand:SI 2 "immediate_operand" "s")
- (match_operand:SI 3 "immediate_operand" "s")))))]
+ (mem:SI (plus:SI
+ (match_operand:SI 1 "gpc_reg_operand" "b")
+ (const
+ (minus:SI (match_operand:SI 2 "immediate_operand" "s")
+ (match_operand:SI 3 "immediate_operand" "s"))))))]
"TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 2"
"lwz %0,%2-%3(%1)"
[(set_attr "type" "load")])
(define_insn "load_toc_v4_PIC_3b"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r")
- (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
- (high:SI
- (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
- (match_operand:SI 3 "symbol_ref_operand" "s")))))]
+ (plus:SI
+ (match_operand:SI 1 "gpc_reg_operand" "b")
+ (high:SI
+ (const
+ (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
+ (match_operand:SI 3 "symbol_ref_operand" "s"))))))]
"TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI == ABI_V4 && flag_pic"
"addis %0,%1,%2-%3@ha")
(define_insn "load_toc_v4_PIC_3c"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r")
- (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b")
- (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
- (match_operand:SI 3 "symbol_ref_operand" "s"))))]
+ (lo_sum:SI
+ (match_operand:SI 1 "gpc_reg_operand" "b")
+ (const
+ (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
+ (match_operand:SI 3 "symbol_ref_operand" "s")))))]
"TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI == ABI_V4 && flag_pic"
"addi %0,%1,%2-%3@l")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f99a83d..11266ff 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-01-10 Segher Boessenkool <segher@kernel.crashing.org>
+
+ PR target/83629
+ * gcc.target/powerpc/pr83629.c: New testcase.
+
2018-01-10 Richard Biener <rguenther@suse.de>
PR testsuite/78768
diff --git a/gcc/testsuite/gcc.target/powerpc/pr83629.c b/gcc/testsuite/gcc.target/powerpc/pr83629.c
new file mode 100644
index 0000000..aeff699
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr83629.c
@@ -0,0 +1,9 @@
+/* { dg-options "-O2 -fPIC -frename-registers --param=sched-autopref-queue-depth=0 -mcpu=603" } */
+
+extern void bar (void *);
+
+void
+foo (void)
+{
+ bar ("");
+}