On Wed, Jan 17, 2018 at 06:42:33PM +0100, Tom de Vries wrote:
> +static rtx
> +expand_builtin_goacc_parlevel_id_size (tree exp, rtx target, int ignore)
> +{
> + tree fndecl = get_callee_fndecl (exp);
> +
> + const char *name;
> + switch (DECL_FUNCTION_CODE (fndecl))
> + {
> + case BUILT_IN_GOACC_PARLEVEL_ID:
> + name = "__builtin_goacc_parlevel_id";
> + break;
> + case BUILT_IN_GOACC_PARLEVEL_SIZE:
> + name = "__builtin_goacc_parlevel_size";
> + break;
Can you avoid that many switches on DECL_FUNCTION_CODE?
Like initialize in this one not just name, but also the
fallback_retval and gen_fn variables and just use them later?
> + default:
> + gcc_unreachable ();
> + }
> +
> + if (oacc_get_fn_attrib (current_function_decl) == NULL_TREE)
> + {
> + error ("%s only supported in openacc code", name);
OpenACC ?
> + return const0_rtx;
> + }
> +
> + tree arg = CALL_EXPR_ARG (exp, 0);
> + if (TREE_CODE (arg) != INTEGER_CST)
> + {
> + error ("non-constant argument 0 to %s", name);
%qs instead of %s, 2 times.
> + return const0_rtx;
> + }
> +
> + int dim = TREE_INT_CST_LOW (arg);
> + switch (dim)
> + {
> + case GOMP_DIM_GANG:
> + case GOMP_DIM_WORKER:
> + case GOMP_DIM_VECTOR:
> + break;
> + default:
> + error ("illegal argument 0 to %s", name);
> + return const0_rtx;
> + }
> +
> + if (ignore)
> + return target;
> +
> + if (!targetm.have_oacc_dim_size ())
> + {
> + rtx retval;
> + switch (DECL_FUNCTION_CODE (fndecl))
> + {
> + case BUILT_IN_GOACC_PARLEVEL_ID:
> + retval = const0_rtx;
> + break;
> + case BUILT_IN_GOACC_PARLEVEL_SIZE:
> + retval = GEN_INT (1);
In addition to moving these assignments to a single switch,
this one can be fallback_retval = const1_rtx;
Otherwise LGTM for stage1.
Jakub