On Wed, Sep 30, 2015 at 9:22 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Wed, Sep 30, 2015 at 03:01:22PM -0400, Nathan Sidwell wrote:
>> On 09/30/15 08:46, Richard Biener wrote:
>>
>> >>>Please don't add any new GENERIC based builtin folders.  Instead add to
>> >>>gimple-fold.c:gimple_fold_builtin
>>
>> Is this patch ok?
>>
>> nathan
>
>> 2015-09-30  Nathan Sidwell  <nat...@codesourcery.com>
>>
>>       * builtins.c: Don't include gomp-constants.h.
>>       (fold_builtin_1): Don't fold acc_on_device here.
>>       * gimple-fold.c: Include gomp-constants.h.
>>       (gimple_fold_builtin_acc_on_device): New.
>>       (gimple_fold_builtin): Call it.
>>
>> Index: gimple-fold.c
>> ===================================================================
>> --- gimple-fold.c     (revision 228288)
>> +++ gimple-fold.c     (working copy)
>> @@ -62,6 +62,7 @@ along with GCC; see the file COPYING3.
>>  #include "output.h"
>>  #include "tree-eh.h"
>>  #include "gimple-match.h"
>> +#include "gomp-constants.h"
>>
>>  /* Return true when DECL can be referenced from current unit.
>>     FROM_DECL (if non-null) specify constructor of variable DECL was taken 
>> from.
>> @@ -2708,6 +2709,34 @@ gimple_fold_builtin_strlen (gimple_stmt_
>>    return true;
>>  }
>>
>> +/* Fold a call to __builtin_acc_on_device.  */
>> +
>> +static bool
>> +gimple_fold_builtin_acc_on_device (gimple_stmt_iterator *gsi, tree arg0)
>> +{
>> +  /* Defer folding until we know which compiler we're in.  */
>> +  if (symtab->state != EXPANSION)
>> +    return false;
>> +
>> +  unsigned val_host = GOMP_DEVICE_HOST;
>> +  unsigned val_dev = GOMP_DEVICE_NONE;
>> +
>> +#ifdef ACCEL_COMPILER
>> +  val_host = GOMP_DEVICE_NOT_HOST;
>> +  val_dev = ACCEL_COMPILER_acc_device;
>> +#endif
>> +
>> +  tree host = build2 (EQ_EXPR, boolean_type_node, arg0,
>> +                   build_int_cst (integer_type_node, val_host));
>> +  tree dev = build2 (EQ_EXPR, boolean_type_node, arg0,
>> +                  build_int_cst (integer_type_node, val_dev));
>> +
>> +  tree result = build2 (TRUTH_OR_EXPR, boolean_type_node, host, dev);
>> +
>> +  result = fold_convert (integer_type_node, result);
>> +  gimplify_and_update_call_from_tree (gsi, result);
>> +  return true;
>> +}
>
> Wouldn't it be better to just emit GIMPLE here instead?
> So
>   tree res = make_ssa_name (boolean_type_node);
>   gimple g = gimple_build_assign (res, EQ_EXPR, arg0,
>                                   build_int_cst (integer_type_node, 
> val_host));
>   gsi_insert_before (gsi, g);
> ...
> ?

Yeah, best with using gimple_build which also canonicalizes/optimizes.

Richard.

>         Jakub

Reply via email to