Skip to content

Commit 4d315ff

Browse files
authored
[GlobalISel] Add CTLZ known bits. (#86436)
Replicated from SDAG.
1 parent 14c3018 commit 4d315ff

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,17 @@ void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
589589
}
590590
break;
591591
}
592+
case TargetOpcode::G_CTLZ:
593+
case TargetOpcode::G_CTLZ_ZERO_UNDEF: {
594+
KnownBits SrcOpKnown;
595+
computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
596+
Depth + 1);
597+
// If we have a known 1, its position is our upper bound.
598+
unsigned PossibleLZ = SrcOpKnown.countMaxLeadingZeros();
599+
unsigned LowBits = llvm::bit_width(PossibleLZ);
600+
Known.Zero.setBitsFrom(LowBits);
601+
break;
602+
}
592603
}
593604

594605
assert(!Known.hasConflict() && "Bits known to be one AND zero?");

llvm/test/CodeGen/AArch64/setcc_knownbits.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ define i1 @lshr_ctlz_undef_cmpeq_one_i64(i64 %in) {
6868
; CHECK-GI-LABEL: lshr_ctlz_undef_cmpeq_one_i64:
6969
; CHECK-GI: // %bb.0:
7070
; CHECK-GI-NEXT: clz x8, x0
71-
; CHECK-GI-NEXT: lsr x8, x8, #6
72-
; CHECK-GI-NEXT: cmp x8, #1
73-
; CHECK-GI-NEXT: cset w0, eq
71+
; CHECK-GI-NEXT: lsr w0, w8, #6
7472
; CHECK-GI-NEXT: ret
7573
%ctlz = call i64 @llvm.ctlz.i64(i64 %in, i1 -1)
7674
%lshr = lshr i64 %ctlz, 6

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-ctlz-zero-undef.mir

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ body: |
6464
; CHECK-NEXT: {{ $}}
6565
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
6666
; CHECK-NEXT: [[CTLZ_ZERO_UNDEF:%[0-9]+]]:_(s32) = G_CTLZ_ZERO_UNDEF [[COPY]](s32)
67-
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
68-
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[CTLZ_ZERO_UNDEF]], [[C]]
69-
; CHECK-NEXT: $vgpr0 = COPY [[AND]](s32)
67+
; CHECK-NEXT: $vgpr0 = COPY [[CTLZ_ZERO_UNDEF]](s32)
7068
%0:_(s32) = COPY $vgpr0
7169
%1:_(s16) = G_CTLZ_ZERO_UNDEF %0
7270
%2:_(s32) = G_ZEXT %1

0 commit comments

Comments
 (0)