diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 03671ceaae70..bec087b4e486 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2015-10-01 Segher Boessenkool + + PR target/67788 + PR target/67789 + * config/rs6000/rs6000.c (TARGET_CANNOT_COPY_INSN_P): New. + (rs6000_cannot_copy_insn_p): New function. + * config/rs6000/rs6000.md (cannot_copy): New attribute. + (load_toc_v4_PIC_1_normal): Set cannot_copy. + (load_toc_v4_PIC_1_476): Ditto. + 2015-10-01 Aditya Kumar * graphite-scop-detection.c (struct sese_l): New conversion constructor diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 023f62235821..e4082959992f 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1513,6 +1513,8 @@ static const struct attribute_spec rs6000_attribute_table[] = #define TARGET_REGISTER_MOVE_COST rs6000_register_move_cost #undef TARGET_MEMORY_MOVE_COST #define TARGET_MEMORY_MOVE_COST rs6000_memory_move_cost +#undef TARGET_CANNOT_COPY_INSN_P +#define TARGET_CANNOT_COPY_INSN_P rs6000_cannot_copy_insn_p #undef TARGET_RTX_COSTS #define TARGET_RTX_COSTS rs6000_rtx_costs #undef TARGET_ADDRESS_COST @@ -31267,6 +31269,15 @@ rs6000_xcoff_encode_section_info (tree decl, rtx rtl, int first) #endif /* HAVE_AS_TLS */ #endif /* TARGET_XCOFF */ +/* Return true if INSN should not be copied. */ + +static bool +rs6000_cannot_copy_insn_p (rtx_insn *insn) +{ + return recog_memoized (insn) >= 0 + && get_attr_cannot_copy (insn); +} + /* Compute a (partial) cost for rtx X. Return true if the complete cost has been computed, and false if subexpressions should be scanned. In either case, *TOTAL contains the cost result. */ diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index cfdb286a2cba..8c53c40aba7e 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -226,6 +226,9 @@ (const_string "no")) (const_string "no"))) +;; Is copying of this instruction disallowed? +(define_attr "cannot_copy" "no,yes" (const_string "no")) + ;; Define floating point instruction sub-types for use with Xfpu.md (define_attr "fp_type" "fp_default,fp_addsub_s,fp_addsub_d,fp_mul_s,fp_mul_d,fp_div_s,fp_div_d,fp_maddsub_s,fp_maddsub_d,fp_sqrt_s,fp_sqrt_d" (const_string "fp_default")) @@ -9130,7 +9133,8 @@ && (flag_pic == 2 || (flag_pic && TARGET_SECURE_PLT))" "bcl 20,31,%0\\n%0:" [(set_attr "type" "branch") - (set_attr "length" "4")]) + (set_attr "length" "4") + (set_attr "cannot_copy" "yes")]) (define_insn "load_toc_v4_PIC_1_476" [(set (reg:SI LR_REGNO) @@ -9148,7 +9152,8 @@ return templ; }" [(set_attr "type" "branch") - (set_attr "length" "4")]) + (set_attr "length" "4") + (set_attr "cannot_copy" "yes")]) (define_expand "load_toc_v4_PIC_1b" [(parallel [(set (reg:SI LR_REGNO) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f56366a28374..3df0caa811f3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-10-01 Segher Boessenkool + + PR target/67788 + PR target/67789 + * gcc.target/powerpc/pr67789.c: New testcase. + 2015-10-01 Steven G. Kargl PR fortran.67802 diff --git a/gcc/testsuite/gcc.target/powerpc/pr67789.c b/gcc/testsuite/gcc.target/powerpc/pr67789.c new file mode 100644 index 000000000000..d1bd0479cca5 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr67789.c @@ -0,0 +1,39 @@ +/* { dg-do assemble } */ +/* { dg-options "-O2 -msecure-plt -fPIC" } */ + +#define FE_TONEAREST 0 +#define FE_UPWARD 1 +#define FE_DOWNWARD 2 +#define FE_TOWARDZERO 3 + +extern int fesetround(int); + +void +set_fpu_rounding_mode (int mode) +{ + int rnd_mode; + + switch (mode) + { + case 2: + rnd_mode = FE_TONEAREST; + break; + + case 4: + rnd_mode = FE_UPWARD; + break; + + case 1: + rnd_mode = FE_DOWNWARD; + break; + + case 3: + rnd_mode = FE_TOWARDZERO; + break; + + default: + return; + } + + fesetround (rnd_mode); +}