On Mon, 25 Jul 2016, Prathamesh Kulkarni wrote: > Hi, > The attached patch tries to fix PR71078. > I am not sure if I have got the converts right. > I put (convert? @0) and (convert1? (abs @1)) > to match for cases when operands's types may > be different from outermost type like in pr71078-3.c
Types of RDIV_EXPR have to be the same so as you have a match on @0 the converts need to be either both present or not present. + (if (FLOAT_TYPE_P (type) as you special-case several types below please use SCALAR_FLOAT_TYPE_P here. + && ! HONOR_NANS (type) + && ! HONOR_INFINITIES (type)) + (switch + (if (type == float_type_node) + (BUILT_IN_COPYSIGNF { build_one_cst (type); } (convert @0))) please use if (types_match (type, float_type_node)) instead of pointer equality. I _think_ you can do better here by using IFN_COPYSIGN but possibly only so if the target supports it. Richard - this seems to be the first pattern in need of generating a builtin where no other was there to match the type to - any idea how we can safely use the internal function here? I see those do not have an expander that would fall back to expanding the regular builtin, correct? Please place the pattern next to /* Optimize -A / A to -1.0 if we don't care about NaNs or Infinities. */ (simplify (rdiv:C @0 (negate @0)) (if (FLOAT_TYPE_P (type) && ! HONOR_NANS (type) && ! HONOR_INFINITIES (type)) { build_minus_one_cst (type); })) where it logically belongs. Thanks, Richard. > test-case (included in patch). > Bootstrap+test in progress on x86_64-unknown-linux-gnu. > > Thanks, > Prathamesh > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)