diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2018-01-10 16:13:07 +0100 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2018-01-10 16:13:07 +0100 |
commit | 8c6e19c1c24794163bc9114bb367c9d61b7f839c (patch) | |
tree | 5f267bfaade3241d4a715ef843334ee0deba267d /gcc | |
parent | c9edeca8b88d20afa80143302be64e2e625e707a (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr83629.c | 9 |
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 (""); +} |