[AArch64] Tighten direct call pattern to repair -fno-plt

2015-08-06  Jiong Wang  <jiong.wang@arm.com>

gcc/
  * config/aarch64/aarch64-protos.h (aarch64_is_noplt_call_p): New declaration.
  * config/aarch64/aarch64.c (aarch64_is_noplt_call_p): New function.
  * config/aarch64/aarch64.md (call_value_symbol): Check noplt scenarios.
  (call_symbol): Likewise.

gcc/testsuite/
  * gcc.target/aarch64/noplt_1.c: New testcase.
  * gcc.target/aarch64/noplt_2.c: Likewise.

From-SVN: r226681
This commit is contained in:
Jiong Wang 2015-08-06 15:57:36 +00:00 committed by Jiong Wang
parent c1153c1987
commit b60d63cbae
7 changed files with 68 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2015-08-06 Jiong Wang <jiong.wang@arm.com>
* config/aarch64/aarch64-protos.h (aarch64_is_noplt_call_p): New declaration.
* config/aarch64/aarch64.c (aarch64_is_noplt_call_p): New function.
* config/aarch64/aarch64.md (call_value_symbol): Check noplt scenarios.
(call_symbol): Likewise.
2015-08-06 Venkataramanan Kumar <Venkataramanan.kumar@amd.com> 2015-08-06 Venkataramanan Kumar <Venkataramanan.kumar@amd.com>
* tree-vect-patterns.c (vect_recog_mult_pattern): New function * tree-vect-patterns.c (vect_recog_mult_pattern): New function

View File

@ -258,6 +258,7 @@ bool aarch64_handle_option (struct gcc_options *, struct gcc_options *,
const struct cl_decoded_option *, location_t); const struct cl_decoded_option *, location_t);
bool aarch64_is_extend_from_extract (machine_mode, rtx, rtx); bool aarch64_is_extend_from_extract (machine_mode, rtx, rtx);
bool aarch64_is_long_call_p (rtx); bool aarch64_is_long_call_p (rtx);
bool aarch64_is_noplt_call_p (rtx);
bool aarch64_label_mentioned_p (rtx); bool aarch64_label_mentioned_p (rtx);
void aarch64_declare_function_name (FILE *, const char*, tree); void aarch64_declare_function_name (FILE *, const char*, tree);
bool aarch64_legitimate_pic_operand_p (rtx); bool aarch64_legitimate_pic_operand_p (rtx);

View File

@ -744,6 +744,24 @@ aarch64_is_long_call_p (rtx sym)
return aarch64_decl_is_long_call_p (SYMBOL_REF_DECL (sym)); return aarch64_decl_is_long_call_p (SYMBOL_REF_DECL (sym));
} }
/* Return true if calls to symbol-ref SYM should not go through
plt stubs. */
bool
aarch64_is_noplt_call_p (rtx sym)
{
const_tree decl = SYMBOL_REF_DECL (sym);
if (flag_pic
&& decl
&& (!flag_plt
|| lookup_attribute ("noplt", DECL_ATTRIBUTES (decl)))
&& !targetm.binds_local_p (decl))
return true;
return false;
}
/* Return true if the offsets to a zero/sign-extract operation /* Return true if the offsets to a zero/sign-extract operation
represent an expression that matches an extend operation. The represent an expression that matches an extend operation. The
operands represent the paramters from operands represent the paramters from

View File

@ -603,7 +603,8 @@
(use (match_operand 2 "" "")) (use (match_operand 2 "" ""))
(clobber (reg:DI LR_REGNUM))] (clobber (reg:DI LR_REGNUM))]
"GET_CODE (operands[0]) == SYMBOL_REF "GET_CODE (operands[0]) == SYMBOL_REF
&& !aarch64_is_long_call_p (operands[0])" && !aarch64_is_long_call_p (operands[0])
&& !aarch64_is_noplt_call_p (operands[0])"
"bl\\t%a0" "bl\\t%a0"
[(set_attr "type" "call")] [(set_attr "type" "call")]
) )
@ -665,7 +666,8 @@
(use (match_operand 3 "" "")) (use (match_operand 3 "" ""))
(clobber (reg:DI LR_REGNUM))] (clobber (reg:DI LR_REGNUM))]
"GET_CODE (operands[1]) == SYMBOL_REF "GET_CODE (operands[1]) == SYMBOL_REF
&& !aarch64_is_long_call_p (operands[1])" && !aarch64_is_long_call_p (operands[1])
&& !aarch64_is_noplt_call_p (operands[1])"
"bl\\t%a1" "bl\\t%a1"
[(set_attr "type" "call")] [(set_attr "type" "call")]
) )

View File

@ -1,3 +1,8 @@
2015-08-06 Jiong Wang <jiong.wang@arm.com>
* gcc.target/aarch64/noplt_1.c: New testcase.
* gcc.target/aarch64/noplt_2.c: Likewise.
2015-08-06 Venkataramanan Kumar <Venkataramanan.kumar@amd.com> 2015-08-06 Venkataramanan Kumar <Venkataramanan.kumar@amd.com>
* gcc.dg/vect/vect-mult-pattern-1.c: New test. * gcc.dg/vect/vect-mult-pattern-1.c: New test.

View File

@ -0,0 +1,15 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fpic -fno-plt" } */
/* { dg-skip-if "-mcmodel=large, no support for -fpic" { aarch64-*-* } { "-mcmodel=large" } { "" } } */
int* bar (void) ;
int
foo (int a)
{
int *b = bar ();
return b[a];
}
/* { dg-final { scan-assembler "#:got:" { target { aarch64_tiny || aarch64_small } } } } */
/* { dg-final { scan-assembler "#:got_lo12:" { target aarch64_small } } } */

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fpic" } */
/* { dg-skip-if "-mcmodel=large, no support for -fpic" { aarch64-*-* } { "-mcmodel=large" } { "" } } */
__attribute__ ((noplt))
int* bar0 (void) ;
int* bar1 (void) ;
int
foo (int a)
{
int *b0 = bar0 ();
int *b1 = bar1 ();
return b0[a] + b1[a];
}
/* { dg-final { scan-assembler-times "#:got:" 1 { target { aarch64_tiny || aarch64_small } } } } */
/* { dg-final { scan-assembler-times "#:got_lo12:" 1 { target aarch64_small } } } */