diff options
author | Tom de Vries <tdevries@suse.de> | 2020-09-23 17:35:23 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2020-09-23 22:45:14 +0200 |
commit | 37c3c297396af3229e9de35ef437f3614e0b4b87 (patch) | |
tree | c91df8dfdce5c553b91ed3c5ffd631ae6df8e16f /gcc | |
parent | 74b27d8eedc7a4c0e8276345107790e6b3c023cb (diff) | |
download | gcc-37c3c297396af3229e9de35ef437f3614e0b4b87.zip gcc-37c3c297396af3229e9de35ef437f3614e0b4b87.tar.gz gcc-37c3c297396af3229e9de35ef437f3614e0b4b87.tar.bz2 |
[nvptx] Split up function ref plus const
With test-case gcc.c-torture/compile/pr92231.c, we run into:
...
nvptx-as: ptxas terminated with signal 11 [Segmentation fault], core dumped^M
compiler exited with status 1
FAIL: gcc.c-torture/compile/pr92231.c -O0 (test for excess errors)
...
due to using a function reference plus constant as operand:
...
mov.u64 %r24,bar+4096';
...
Fix this by splitting such an insn into:
...
mov.u64 %r24,bar';
add.u64 %r24,%r24,4096';
...
Tested on nvptx.
gcc/ChangeLog:
* config/nvptx/nvptx.md: Don't allow operand containing sum of
function ref and const.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/nvptx/nvptx.md | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md index 6178e6a..035f6e0 100644 --- a/gcc/config/nvptx/nvptx.md +++ b/gcc/config/nvptx/nvptx.md @@ -146,6 +146,13 @@ return true; }) +;; Test for a function symbol ref operand +(define_predicate "symbol_ref_function_operand" + (match_code "symbol_ref") +{ + return SYMBOL_REF_FUNCTION_P (op); +}) + (define_attr "predicable" "false,true" (const_string "true")) @@ -241,6 +248,17 @@ } [(set_attr "subregs_ok" "true")]) +;; ptxas segfaults on 'mov.u64 %r24,bar+4096', so break it up. +(define_split + [(set (match_operand:DI 0 "nvptx_register_operand") + (const:DI (plus:DI (match_operand:DI 1 "symbol_ref_function_operand") + (match_operand 2 "const_int_operand"))))] + "" + [(set (match_dup 0) (match_dup 1)) + (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2))) + ] + "") + (define_insn "*mov<mode>_insn" [(set (match_operand:SDFM 0 "nonimmediate_operand" "=R,R,m") (match_operand:SDFM 1 "general_operand" "RF,m,R"))] |