Skip to content

Commit

Permalink
[InstCombine] Remove 64-bit bit width restriction from m_ConstantInt(…
Browse files Browse the repository at this point in the history
…uint64_t*&)

I think we only need to make sure the value fits in 64-bits not that bit width is 64-bit.

This helps places that use this for shift amounts since the shift amount needs to be the same bitwidth as the LHS, but can't be larger than the bit width.

Differential Revision: https://reviews.llvm.org/D34737

llvm-svn: 306577
  • Loading branch information
topperc committed Jun 28, 2017
1 parent be9931d commit 65aeba7
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 9 deletions.
2 changes: 1 addition & 1 deletion llvm/include/llvm/IR/PatternMatch.h
Expand Up @@ -402,7 +402,7 @@ struct bind_const_intval_ty {

template <typename ITy> bool match(ITy *V) {
if (const auto *CV = dyn_cast<ConstantInt>(V))
if (CV->getBitWidth() <= 64) {
if (CV->getValue().ule(UINT64_MAX)) {
VR = CV->getZExtValue();
return true;
}
Expand Down
11 changes: 3 additions & 8 deletions llvm/test/Transforms/InstCombine/icmp.ll
Expand Up @@ -762,16 +762,11 @@ 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]]
; CHECK-NEXT: [[TMP1:%.*]] = and i128 [[X1:%.*]], 16711935
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i128 [[TMP1]], 4980863
; CHECK-NEXT: ret i1 [[TMP2]]
;
%conv = and i128 %x1, 255
%cmp = icmp eq i128 %conv, 127
Expand Down

0 comments on commit 65aeba7

Please sign in to comment.