summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2020-02-25 17:24:27 +0300
committerHans Wennborg <hans@chromium.org>2020-02-27 13:45:21 +0100
commitb2b41bc3b51a083fb9e36e50d0131dfbd79e00ce (patch)
tree4818108c8992fb2d9d452c6c9e653acd0568e2f6 /llvm/test/Transforms
parentac293ede5e62cfc569f2d5d8f4667e6188afced0 (diff)
downloadbcm5719-llvm-b2b41bc3b51a083fb9e36e50d0131dfbd79e00ce.tar.gz
bcm5719-llvm-b2b41bc3b51a083fb9e36e50d0131dfbd79e00ce.zip
[InstCombine] foldShiftIntoShiftInAnotherHandOfAndInICmp(): fix miscompile (PR44802)
Much like with reassociateShiftAmtsOfTwoSameDirectionShifts(), as input, we have the following pattern: icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0 We want to rewrite that as: icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x) While we know that originally (Q+K) would not overflow (because 2 * (N-1) u<= iN -1), we may have looked past extensions of shift amounts. so it may now overflow in smaller bitwidth. To ensure that does not happen, we need to ensure that the total maximal shift amount is still representable in that smaller bitwidth. If the overflow would happen, (Q+K) u< bitwidth(x) check would be bogus. https://bugs.llvm.org/show_bug.cgi?id=44802 (cherry picked from commit 2855c8fed9326ec44526767f1596a4fe4e55dc70)
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll11
1 files changed, 7 insertions, 4 deletions
diff --git a/llvm/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll b/llvm/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll
index 0386d8042f9..97506e193e6 100644
--- a/llvm/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll
+++ b/llvm/test/Transforms/InstCombine/shift-amount-reassociation-in-bittest.ll
@@ -688,13 +688,16 @@ entry:
ret i1 %tobool
}
-; FIXME: this is a miscompile. We should not transform this.
; See https://bugs.llvm.org/show_bug.cgi?id=44802
define i1 @pr44802(i3 %a, i3 %x, i3 %y) {
; CHECK-LABEL: @pr44802(
-; CHECK-NEXT: [[TMP1:%.*]] = and i3 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i3 [[TMP1]], 0
-; CHECK-NEXT: ret i1 [[TMP2]]
+; CHECK-NEXT: [[T0:%.*]] = icmp ne i3 [[A:%.*]], 0
+; CHECK-NEXT: [[T1:%.*]] = zext i1 [[T0]] to i3
+; CHECK-NEXT: [[T2:%.*]] = lshr i3 [[X:%.*]], [[T1]]
+; CHECK-NEXT: [[T3:%.*]] = shl i3 [[Y:%.*]], [[T1]]
+; CHECK-NEXT: [[T4:%.*]] = and i3 [[T2]], [[T3]]
+; CHECK-NEXT: [[T5:%.*]] = icmp ne i3 [[T4]], 0
+; CHECK-NEXT: ret i1 [[T5]]
;
%t0 = icmp ne i3 %a, 0
%t1 = zext i1 %t0 to i3
OpenPOWER on IntegriCloud