From 13501a8d08b829095cb9f85d2a361cf0e76b6325 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Wed, 28 Jun 2017 06:42:48 +0000 Subject: [PATCH] [InstCombine] Add test case demonstrating that we don't handle icmp eq (trunc (lshr(X, cst1)), cst->icmp (and X, mask), cst when the shift type is larger than 64-bits. NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306508 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/PatternMatch.h | 1 + test/Transforms/InstCombine/icmp.ll | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/llvm/IR/PatternMatch.h b/include/llvm/IR/PatternMatch.h index 4015e445097..ae68b173c6b 100644 --- a/include/llvm/IR/PatternMatch.h +++ b/include/llvm/IR/PatternMatch.h @@ -379,6 +379,7 @@ struct bind_const_intval_ty { template bool match(ITy *V) { if (const auto *CV = dyn_cast(V)) if (CV->getBitWidth() <= 64) { + return false; VR = CV->getZExtValue(); return true; } diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index 12e8cc8f8a3..0e2627b1768 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -762,6 +762,27 @@ define i1 @test52(i32 %x1) { ret i1 %A } +; TODO we have a 64-bit or less restriction in the handling for this pattern. We should remove that and do the same thing we do above. +define i1 @test52b(i128 %x1) { +; CHECK-LABEL: @test52b( +; CHECK-NEXT: [[CONV:%.*]] = and i128 [[X1:%.*]], 255 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i128 [[CONV]], 127 +; CHECK-NEXT: [[TMP2:%.*]] = lshr i128 [[X1]], 16 +; CHECK-NEXT: [[TMP3:%.*]] = trunc i128 [[TMP2]] to i8 +; CHECK-NEXT: [[CMP15:%.*]] = icmp eq i8 [[TMP3]], 76 +; CHECK-NEXT: [[A:%.*]] = and i1 [[CMP]], [[CMP15]] +; CHECK-NEXT: ret i1 [[A]] +; + %conv = and i128 %x1, 255 + %cmp = icmp eq i128 %conv, 127 + %tmp2 = lshr i128 %x1, 16 + %tmp3 = trunc i128 %tmp2 to i8 + %cmp15 = icmp eq i8 %tmp3, 76 + + %A = and i1 %cmp, %cmp15 + ret i1 %A +} + ; PR9838 define i1 @test53(i32 %a, i32 %b) { ; CHECK-LABEL: @test53( -- 2.50.1