[AArch64] Use @ pattern to eliminate switch statement in one more place

Message ID 5BC5A755.1010806@arm.com
State New
Headers show
Series
  • [AArch64] Use @ pattern to eliminate switch statement in one more place
Related show

Commit Message

Kyrylo Tkachov Oct. 16, 2018, 8:54 a.m.
Hi all,

We can use the new '@' modifier to MD patterns to generate mode-parametrised gen_ functions
for the despeculate_copy patterns and therefore remove the switch on modes in aarch64.c
that is used to pick the right generator. This simplifies the code.

Bootstrapped and tested on aarch64-none-linux-gnu.

Ok for trunk?

Thanks,
Kyrill

2018-10-16  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

     * config/aarch64/aarch64.md (despeculate_copy<ALLI_TI:mode>):
     Rename to...
     (@despeculate_copy<ALLI_TI:mode>): ... This.
     * config/aarch64/aarch64.c (aarch64_speculation_safe_value): Remove
     switch statement.

Comments

Richard Sandiford Oct. 16, 2018, 5:11 p.m. | #1
Kyrylo Tkachov <kyrylo.tkachov@arm.com> writes:
> Hi all,

>

> We can use the new '@' modifier to MD patterns to generate

> mode-parametrised gen_ functions

> for the despeculate_copy patterns and therefore remove the switch on

> modes in aarch64.c

> that is used to pick the right generator. This simplifies the code.

>

> Bootstrapped and tested on aarch64-none-linux-gnu.

>

> Ok for trunk?

>

> Thanks,

> Kyrill

>

> 2018-10-16  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

>

>      * config/aarch64/aarch64.md (despeculate_copy<ALLI_TI:mode>):

>      Rename to...

>      (@despeculate_copy<ALLI_TI:mode>): ... This.

>      * config/aarch64/aarch64.c (aarch64_speculation_safe_value): Remove

>      switch statement.


OK, thanks.

Richard


>

> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c

> index 34d08a075221fd4c098e9b5e8fabd8fe3948d285..03041c5af99e52de8f5b4d8342e93ef2b90985bc 100644

> --- a/gcc/config/aarch64/aarch64.c

> +++ b/gcc/config/aarch64/aarch64.c

> @@ -17968,26 +17968,7 @@ aarch64_speculation_safe_value (machine_mode mode,

>    if (!aarch64_reg_or_zero (failval, mode))

>      failval = copy_to_mode_reg (mode, failval);

>  

> -  switch (mode)

> -    {

> -    case E_QImode:

> -      emit_insn (gen_despeculate_copyqi (result, val, failval));

> -      break;

> -    case E_HImode:

> -      emit_insn (gen_despeculate_copyhi (result, val, failval));

> -      break;

> -    case E_SImode:

> -      emit_insn (gen_despeculate_copysi (result, val, failval));

> -      break;

> -    case E_DImode:

> -      emit_insn (gen_despeculate_copydi (result, val, failval));

> -      break;

> -    case E_TImode:

> -      emit_insn (gen_despeculate_copyti (result, val, failval));

> -      break;

> -    default:

> -      gcc_unreachable ();

> -    }

> +  emit_insn (gen_despeculate_copy (mode, result, val, failval));

>    return result;

>  }

>  

> diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md

> index 4170d3fbb00c733a1411e726a67af17052800307..32d6f138232c617213f0d3488db49cb3546eb0a9 100644

> --- a/gcc/config/aarch64/aarch64.md

> +++ b/gcc/config/aarch64/aarch64.md

> @@ -6743,7 +6743,7 @@ (define_insn "speculation_barrier"

>  ;; Support for __builtin_speculation_safe_value when we have speculation

>  ;; tracking enabled.  Use the speculation tracker to decide whether to

>  ;; copy operand 1 to the target, or to copy the fail value (operand 2).

> -(define_expand "despeculate_copy<ALLI_TI:mode>"

> +(define_expand "@despeculate_copy<ALLI_TI:mode>"

>    [(set (match_operand:ALLI_TI 0 "register_operand" "=r")

>  	(unspec_volatile:ALLI_TI

>  	 [(match_operand:ALLI_TI 1 "register_operand" "r")

Patch

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 34d08a075221fd4c098e9b5e8fabd8fe3948d285..03041c5af99e52de8f5b4d8342e93ef2b90985bc 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -17968,26 +17968,7 @@  aarch64_speculation_safe_value (machine_mode mode,
   if (!aarch64_reg_or_zero (failval, mode))
     failval = copy_to_mode_reg (mode, failval);
 
-  switch (mode)
-    {
-    case E_QImode:
-      emit_insn (gen_despeculate_copyqi (result, val, failval));
-      break;
-    case E_HImode:
-      emit_insn (gen_despeculate_copyhi (result, val, failval));
-      break;
-    case E_SImode:
-      emit_insn (gen_despeculate_copysi (result, val, failval));
-      break;
-    case E_DImode:
-      emit_insn (gen_despeculate_copydi (result, val, failval));
-      break;
-    case E_TImode:
-      emit_insn (gen_despeculate_copyti (result, val, failval));
-      break;
-    default:
-      gcc_unreachable ();
-    }
+  emit_insn (gen_despeculate_copy (mode, result, val, failval));
   return result;
 }
 
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 4170d3fbb00c733a1411e726a67af17052800307..32d6f138232c617213f0d3488db49cb3546eb0a9 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -6743,7 +6743,7 @@  (define_insn "speculation_barrier"
 ;; Support for __builtin_speculation_safe_value when we have speculation
 ;; tracking enabled.  Use the speculation tracker to decide whether to
 ;; copy operand 1 to the target, or to copy the fail value (operand 2).
-(define_expand "despeculate_copy<ALLI_TI:mode>"
+(define_expand "@despeculate_copy<ALLI_TI:mode>"
   [(set (match_operand:ALLI_TI 0 "register_operand" "=r")
 	(unspec_volatile:ALLI_TI
 	 [(match_operand:ALLI_TI 1 "register_operand" "r")