On Sat, 2023-11-25 at 11:17 +0100, Jakub Jelinek wrote: > The middle-end has been changed quite recently to canonicalize > -abs (x) to copysign (x, -1) rather than the other way around. > While I agree with that at GIMPLE level, since it matches the GIMPLE > goal of as few operations as possible for a canonical form (-abs (x) > is 2 GIMPLE statements, copysign (x, -1) is just one), I must say > I don't really like that being done on RTL as well (or at least > not canonicalizing (COPYSIGN x, negative) back to (NEG (ABS x))), > because on most targets most of floating point constants need to be loaded > from memory, there are a few exceptions but -1 is often not one of them.
On LoongArch fneg+fabs is even slower than loading a -1 from mem then do copysign for some micro-architectural reason I don't know. (FWIW on LoongArch with LSX, the fastest way may be directly setting the sign bit with LSX vbitseti instruction - it will also set the sign bits for "junk" elements in the high bits of the vector register but there is no harm.) Can we make a target hook to control this? -- Xi Ruoyao <xry...@xry111.site> School of Aerospace Science and Technology, Xidian University