Fix an unrecognised insn ICE that only shows while using builtins at -O0.

gcc/ChangeLog:

        * config/gcn/gcn.cc (gcn_expand_builtin_1): Enable the "mode" parameter
        and ensure that "target" is a register for most of the builtins.
---
 gcc/config/gcn/gcn.cc | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/gcc/config/gcn/gcn.cc b/gcc/config/gcn/gcn.cc
index 5ffeb23dbaa..665b05321e1 100644
--- a/gcc/config/gcn/gcn.cc
+++ b/gcc/config/gcn/gcn.cc
@@ -4528,7 +4528,7 @@ gcn_expand_cmp_swap (tree exp, rtx target)
 
 static rtx
 gcn_expand_builtin_1 (tree exp, rtx target, rtx /*subtarget */ ,
-                     machine_mode /*mode */ , int ignore,
+                     machine_mode mode, int ignore,
                      struct gcn_builtin_description *)
 {
   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
@@ -4620,6 +4620,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64SFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64SFmode,
@@ -4631,6 +4633,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (SFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          SFmode,
@@ -4642,6 +4646,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64SFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64SFmode,
@@ -4653,6 +4659,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64DFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64DFmode,
@@ -4664,6 +4672,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64SFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64SFmode,
@@ -4675,6 +4685,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64DFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64DFmode,
@@ -4686,6 +4698,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg1 = force_reg (V64SFmode,
                              expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                           V64SFmode,
@@ -4701,6 +4715,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg1 = force_reg (V64DFmode,
                              expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                           V64DFmode,
@@ -4716,6 +4732,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64SFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64SFmode,
@@ -4727,6 +4745,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64SFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64SFmode,
@@ -4738,6 +4758,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64DFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64DFmode,
@@ -4749,6 +4771,8 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx 
/*subtarget */ ,
       {
        if (ignore)
          return target;
+       if (!REG_P (target))
+         target = gen_reg_rtx (mode);
        rtx arg = force_reg (V64DFmode,
                             expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX,
                                          V64DFmode,
-- 
2.50.0

Reply via email to