This patch update the lowering of the shifta intrinsic to match
the behvior of gfortran. When the SHIFT value is equal to the
integer bitwidth then we handle it differently.
This is due to the operation used in lowering (mlir::arith::ShRSIOp)
that lowers to ashr.
Before this patch we have the following results:
SHIFTA( -1, 8) = 0 SHIFTA( -2, 8) = 0 SHIFTA( -30, 8) = 0 SHIFTA( -31, 8) = 0 SHIFTA( -32, 8) = 0 SHIFTA( -33, 8) = 0 SHIFTA(-126, 8) = 0 SHIFTA(-127, 8) = 0 SHIFTA(-128, 8) = 0
While gfortran is giving this:
SHIFTA( -1, 8) = -1 SHIFTA( -2, 8) = -1 SHIFTA( -30, 8) = -1 SHIFTA( -31, 8) = -1 SHIFTA( -32, 8) = -1 SHIFTA( -33, 8) = -1 SHIFTA(-126, 8) = -1 SHIFTA(-127, 8) = -1 SHIFTA(-128, 8) = -1
With this patch flang and gfortran have the same behavior.
Do you know if using a fir.if vs a SelectOp impacts the generated code from a performance point of view ? I tend to avoid branches in intrinsic code, but I do not have any data to prove this is a better choice either, and probably easy to later update if this turns out to be sub-optimal.