[flang] Handle special case for SHIFTA intrinsic
authorValentin Clement <clementval@gmail.com>
Thu, 1 Sep 2022 14:27:51 +0000 (16:27 +0200)
committerValentin Clement <clementval@gmail.com>
Thu, 1 Sep 2022 14:28:08 +0000 (16:28 +0200)
commit83ba00bd2eb7ac13fe18edecb306c6c9e14d4d67
tree4e7616be2b94adc8fa146e0699d54885ec795662
parent4f046bc8e0b9439efeb2906ced7930f831495ee4
[flang] Handle special case for SHIFTA intrinsic

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.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D133104
flang/lib/Lower/IntrinsicCall.cpp
flang/test/Lower/Intrinsics/shifta.f90