Hi Andrew,

Thanks again for your help! Unfortunately I didn't manage to replace 
gimplify_build3() yet. To give you a bit more of context, this is what I've 
tried so far:

I'm trying to implement something similar to gimplify_build3():
```
tree
gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
                 tree type, tree a, tree b, tree c)
{
 tree ret;
 location_t loc = gimple_location (gsi_stmt (*gsi));

 ret = fold_build3_loc (loc, code, type, a, b, c);
 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
                                  GSI_SAME_STMT);
}
```
such as:
```
tree
gimplify_buildfma (gimple_stmt_iterator *gsi, internal_fn fn
                 tree type, tree a, tree b, tree c)
{
 tree ret;
 location_t loc = gimple_location (gsi_stmt (*gsi));

 // TODO: check that fn is in [IFN_FMA, IFN_FMS, IFN_FNMA, IFN_FNMS]

 gcall *g = gimple_build_call_internal (fn, 3, a, b, c);
 gimple_set_location (g, loc);

 ret = ???

 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
                                  GSI_SAME_STMT);
}
```
but I don't understand how to set `ret` from `g`. Do you have any idea?

If you need to understand why I’m trying to do this, please see:
  <https://github.com/thvnx/gcc/commit/47761af29f2bceb8e9404737bfb7d613a30eeebf 
<https://github.com/thvnx/gcc/commit/47761af29f2bceb8e9404737bfb7d613a30eeebf>>.

Thanks,
Laurent


On Tuesday, February 05, 2019 00:33 CET, Andrew Pinski <pins...@gmail.com> 
wrote:

> On Mon, Feb 4, 2019 at 3:13 PM Laurent Thévenoux <l...@thvnx.com> wrote:
>> 
>> Hi,
>> 
>> Thanks for pointing this me out. Nevertheless, I’m not sure this can apply 
>> in my case since gimple_build_call_internal() returns a gimple data type 
>> while gimplify_build3() returns a tree data type. I’ll try to figure how 
>> faisable is to use it in my case. For more context, see the code snippet 
>> below.
> 
> You need to create a new temp ssa name to hold the FMA results.  There
> are few examples in the tree-ssa-phi-opt.c code for on how to use this
> way instead of using gimplify_build3.
> 
> Thanks,
> Andrew Pinski
> 
>> 
>> ```
>> static void
>> some_fn (gimple_stmt_iterator *gsi, tree inner_type, tree ar, tree ai, tree 
>> br, tree bi)
>> {
>>  tree rr, ri, pr1;
>> 
>>  p1r = gimplify_build2 (gsi, MULT_EXPR, inner_type, ar, ar);
>>  rr  = gimplify_build3 (gsi, FMA_EXPR, inner_type, ai, ai, p1r);
>>  ri  = build_real (inner_type, dconst0);
>>  update_complex_assignment (gsi, rr, ri);
>> }
>> 
>> ```
>> 
>>> Le 4 févr. 2019 à 23:38, Andrew Pinski <pins...@gmail.com> a écrit :
>>> 
>>> On Mon, Feb 4, 2019 at 4:47 AM Laurent Thévenoux <l...@thvnx.com> wrote:
>>>> 
>>>> Sorry for duplicate, gcc-help was not the right mailing list for this one.
>>>> 
>>>> 
>>>> -------- Original Message --------
>>>> Subject: How to gimplify_build a FMA_EXPR since it was removed?
>>>> Date: Monday, February 04, 2019 13:28 CET
>>>> From: Laurent Thévenoux <l...@thvnx.com>
>>>> To: gcc-h...@gcc.gnu.org
>>>> CC: richard.sandif...@linaro.org
>>>> 
>>>> 
>>>> 
>>>> Hi,
>>>> 
>>>> I've developed some code in gcc/tree-complex.c. I was using the
>>>> FMA_EXPR to generate fma operations such as in:
>>>> 
>>>> ```
>>>> rr  = gimplify_build3 (gsi, FMA_EXPR, inner_type, ai, ai, p1r);```
>>>> 
>>>> FMA_EXPR was removed in 
>>>> https://gcc.gnu.org/ml/gcc-patches/2018-05/msg00570.html.
>>>> 
>>>> Is there an easy way to gimplify FMAs with the new functions
>>>> introduced in the patch below?
>>> 
>>> From that patch (e.g. rs6000_gimple_fold_builtin):
>>> 
>>> - gimple *g = gimple_build_assign (lhs, FMA_EXPR, arg0, arg1, arg2);
>>> + gcall *g = gimple_build_call_internal (IFN_FMA, 3, arg0, arg1, arg2);
>>> + gimple_call_set_lhs (g, lhs);
>>> + gimple_call_set_nothrow (g, true);
>>> 
>>> 
>>> Thanks,
>>> Andrew Pinski
>>> 
>>> 
>>>> 
>>>> Thanks,
>>>> Laurent
>> 

Reply via email to