[PATCH] D113056: [IVDescriptor] Make sure the sign is included for negative extension.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 12 08:17:34 PST 2021
fhahn updated this revision to Diff 386861.
fhahn added a comment.
In D113056#3127502 <https://reviews.llvm.org/D113056#3127502>, @RKSimon wrote:
> In D113056#3127482 <https://reviews.llvm.org/D113056#3127482>, @fhahn wrote:
>
>> In D113056#3127479 <https://reviews.llvm.org/D113056#3127479>, @fhahn wrote:
>>
>>> Ping :)
>>>
>>> should also fix PR51794
>>
>> Should be PR52485....
>
> Worth an extra test case?
Rebased on top of committed test from PR52485.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D113056/new/
https://reviews.llvm.org/D113056
Files:
llvm/lib/Analysis/IVDescriptors.cpp
llvm/test/Transforms/LoopVectorize/reduction-small-size.ll
Index: llvm/test/Transforms/LoopVectorize/reduction-small-size.ll
===================================================================
--- llvm/test/Transforms/LoopVectorize/reduction-small-size.ll
+++ llvm/test/Transforms/LoopVectorize/reduction-small-size.ll
@@ -74,18 +74,7 @@
define i32 @pr51794_signed_negative(i16 %iv.start, i32 %xor.start) {
; CHECK-LABEL: define {{.*}} @pr51794_signed_negative(
-; CHECK: [[XOR_START:%.+]] = insertelement <4 x i32> zeroinitializer, i32 %xor.start, i32 0
-; CHECK-LABEL: vector.body:
-; CHECK: [[XOR_RED:%.+]] = phi <4 x i32> [ [[XOR_START]], %vector.ph ], [ [[XOR_SEXT:%.+]], %vector.body ]
-; CHECK: [[AND:%.+]] = and <4 x i32> [[XOR_RED]], <i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT: [[XOR:%.+]] = xor <4 x i32> [[AND]], <i32 -1, i32 -1, i32 -1, i32 -1>
-; CHECK: [[XOR_TRUNC:%.+]] = trunc <4 x i32> [[XOR]] to <4 x i1>
-; CHECK-NEXT: [[XOR_SEXT]] = sext <4 x i1> [[XOR_TRUNC]] to <4 x i32>
-;
-; CHECK-LABEL: middle.block:
-; CHECK-NEXT: [[RES_TRUNC:%.+]] = trunc <4 x i32> [[XOR_SEXT]] to <4 x i1>
-; CHECK-NEXT: [[RES_RED:%.+]] = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> [[RES_TRUNC]])
-; CHECK-NEXT: sext i1 [[RES_RED]] to i32
+; CHECK-NOT: vector.body:
;
entry:
br label %loop
@@ -106,18 +95,7 @@
define i32 @pr52485_signed_negative(i32 %xor.start) {
; CHECK-LABEL: define {{.*}} @pr52485_signed_negative(
-; CHECK: [[XOR_START:%.+]] = insertelement <4 x i32> zeroinitializer, i32 %xor.start, i32 0
-; CHECK-LABEL: vector.body:
-; CHECK: [[XOR_RED:%.+]] = phi <4 x i32> [ [[XOR_START]], %vector.ph ], [ [[XOR_SEXT:%.+]], %vector.body ]
-; CHECK: [[AND:%.+]] = and <4 x i32> [[XOR_RED]], <i32 255, i32 255, i32 255, i32 255>
-; CHECK-NEXT: [[XOR:%.+]] = xor <4 x i32> [[AND]], <i32 -9, i32 -9, i32 -9, i32 -9>
-; CHECK: [[XOR_TRUNC:%.+]] = trunc <4 x i32> [[XOR]] to <4 x i8>
-; CHECK-NEXT: [[XOR_SEXT]] = sext <4 x i8> [[XOR_TRUNC]] to <4 x i32>
-;
-; CHECK-LABEL: middle.block:
-; CHECK-NEXT: [[RES_TRUNC:%.+]] = trunc <4 x i32> [[XOR_SEXT]] to <4 x i8>
-; CHECK-NEXT: [[RES_RED:%.+]] = call i8 @llvm.vector.reduce.xor.v4i8(<4 x i8> [[RES_TRUNC]])
-; CHECK-NEXT: sext i8 [[RES_RED]] to i32
+; CHECK-NOT: vector.body:
;
entry:
br label %loop
Index: llvm/lib/Analysis/IVDescriptors.cpp
===================================================================
--- llvm/lib/Analysis/IVDescriptors.cpp
+++ llvm/lib/Analysis/IVDescriptors.cpp
@@ -146,12 +146,9 @@
// meaning that we will use sext instructions instead of zext
// instructions to restore the original type.
IsSigned = true;
- if (!Bits.isNegative())
- // If the value is not known to be negative, we don't known what the
- // upper bit is, and therefore, we don't know what kind of extend we
- // will need. In this case, just increase the bit width by one bit and
- // use sext.
- ++MaxBitWidth;
+ // Make sure at at least one sign bit is included in the result, so it
+ // will get properly sign-extended.
+ ++MaxBitWidth;
}
}
if (!isPowerOf2_64(MaxBitWidth))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113056.386861.patch
Type: text/x-patch
Size: 3154 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211112/445e8ca7/attachment.bin>
More information about the llvm-commits
mailing list