private static double NotFolded(double a)
{
var b = 1.0d;
if (a is 0)
return 0;
return Math.Cos(b);
}
Codegen, Windows x64:
G_M24041_IG01:
vzeroupper
G_M24041_IG02:
vxorps xmm1, xmm1
vucomisd xmm0, xmm1
jp SHORT G_M24041_IG05
jne SHORT G_M24041_IG05
G_M24041_IG03:
vxorps xmm0, xmm0
G_M24041_IG04:
ret
G_M24041_IG05:
vmovsd xmm0, qword ptr [reloc @RWD00]
G_M24041_IG06:
jmp System.Math:Cos(double):double
Value numbering today supports folding some intrinsics implemented by user calls. However, that support is only for actual GT_INTRINSIC nodes. Tail calls to intrinsics implemented via user calls are imported as plain GT_CALLs, blocking the optimization.
Issue is for tracking purposes, I do not expect this to be a big problem in real-world scenarios.
The comment here indicates that we should only be doing it for tail prefixed calls, so probably this is just a small mistake that it is happening for implicit tailcalls too. Should be simple to fix.
Reproduction:
Codegen, Windows x64:
Value numbering today supports folding some intrinsics implemented by user calls. However, that support is only for actual
GT_INTRINSIC
nodes. Tail calls to intrinsics implemented via user calls are imported as plainGT_CALL
s, blocking the optimization.Issue is for tracking purposes, I do not expect this to be a big problem in real-world scenarios.
category:cq theme:tail-call skill-level:beginner cost:small impact:small