On 12/19/2017 04:39 PM, Tom de Vries wrote: > On 12/20/2017 12:25 AM, Cesar Philippidis wrote: >> og7-ptx-cuda9.diff >> >> >> 2017-12-19 Cesar Philippidis <ce...@codesourcery.com> >> >> gcc/ >> * config/nvptx/nvptx.c (output_init_frag): Don't use generic address >> spaces for function labels. >> >> gcc/testsuite/ >> * gcc.target/nvptx/indirect_call.c: New test. >> >> >> diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c >> index dfb27ef..a7b4c09 100644 >> --- a/gcc/config/nvptx/nvptx.c >> +++ b/gcc/config/nvptx/nvptx.c >> @@ -1894,9 +1894,15 @@ output_init_frag (rtx sym) >> if (sym) >> { >> - fprintf (asm_out_file, "generic("); >> + bool function = SYMBOL_REF_DECL (sym) >> + && (TREE_CODE (SYMBOL_REF_DECL (sym)) == FUNCTION_DECL); > > Please indent using parentheses like this: > > bool function = (SYMBOL_REF_DECL (sym) > && (TREE_CODE (SYMBOL_REF_DECL (sym)) == ...));
Done. >> + if (!function) >> + fprintf (asm_out_file, "generic("); >> output_address (VOIDmode, sym); >> - fprintf (asm_out_file, val ? ") + " : ")"); >> + if (!function) >> + fprintf (asm_out_file, val ? ") + " : ")"); >> + else if (val) >> + fprintf (asm_out_file, " + "); > > > Please use: > > if (!function) > fprintf (asm_out_file, ")"); > if (val) > fprintf (asm_out_file, " + "); Done. >> } >> if (!sym || val) >> diff --git a/gcc/testsuite/gcc.target/nvptx/indirect_call.c >> b/gcc/testsuite/gcc.target/nvptx/indirect_call.c >> new file mode 100644 >> index 0000000..39992a7 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.target/nvptx/indirect_call.c >> @@ -0,0 +1,19 @@ >> +/* { dg-options "-O2 -msoft-stack" } */ >> +/* { dg-do run } */ >> + >> +int >> +f1 (int a) >> +{ >> + return a + 1; >> +} >> + >> +int (*f2)(int) = f1; >> + >> +int >> +main () >> +{ >> + if (f2 (100) != 101) >> + __builtin_abort(); >> + >> + return 0; >> +} >> Here's the updated patch with the changes that you requested. There are no new regressions in trunk. I tested it on my desktop running driver 387.34 on a Pascal GPU. Is this OK for trunk? Cesar
2018-01-18 Cesar Philippidis <ce...@codesourcery.com> gcc/ * config/nvptx/nvptx.c (output_init_frag): Don't use generic address spaces for function labels. gcc/testsuite/ * gcc.target/nvptx/indirect_call.c: New test. diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index 86fc13f4fc0..4cb87c8ad07 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -1899,9 +1899,15 @@ output_init_frag (rtx sym) if (sym) { - fprintf (asm_out_file, "generic("); + bool function = (SYMBOL_REF_DECL (sym) + && (TREE_CODE (SYMBOL_REF_DECL (sym)) == FUNCTION_DECL)); + if (!function) + fprintf (asm_out_file, "generic("); output_address (VOIDmode, sym); - fprintf (asm_out_file, val ? ") + " : ")"); + if (!function) + fprintf (asm_out_file, ")"); + if (val) + fprintf (asm_out_file, " + "); } if (!sym || val) diff --git a/gcc/testsuite/gcc.target/nvptx/indirect_call.c b/gcc/testsuite/gcc.target/nvptx/indirect_call.c new file mode 100644 index 00000000000..39992a7137b --- /dev/null +++ b/gcc/testsuite/gcc.target/nvptx/indirect_call.c @@ -0,0 +1,19 @@ +/* { dg-options "-O2 -msoft-stack" } */ +/* { dg-do run } */ + +int +f1 (int a) +{ + return a + 1; +} + +int (*f2)(int) = f1; + +int +main () +{ + if (f2 (100) != 101) + __builtin_abort(); + + return 0; +}