Skip to content

Commit 9d6b92e

Browse files
authored
[DAG] SelectionDAG::isKnownToBeAPowerOfTwo - add ISD::TRUNCATE handling and tests (#184365)
Closes #181654
1 parent 3f42ec6 commit 9d6b92e

File tree

3 files changed

+48
-11
lines changed

3 files changed

+48
-11
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4823,6 +4823,11 @@ bool SelectionDAG::isKnownToBeAPowerOfTwo(SDValue Val,
48234823
Depth + 1);
48244824
}
48254825

4826+
case ISD::TRUNCATE: {
4827+
return (OrZero || isKnownNeverZero(Val, Depth)) &&
4828+
isKnownToBeAPowerOfTwo(Val.getOperand(0), OrZero, Depth + 1);
4829+
}
4830+
48264831
case ISD::ROTL:
48274832
case ISD::ROTR:
48284833
return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2+
; RUN: llc < %s -mtriple=arm64-unknown-unknown-gnu | FileCheck %s --check-prefix=CHECK
3+
4+
define i8 @pow2_trunc_orzero_false_notzero(i32 %x, i8 %z){
5+
; CHECK-LABEL: pow2_trunc_orzero_false_notzero:
6+
; CHECK: // %bb.0:
7+
; CHECK-NEXT: and w8, w1, #0xff
8+
; CHECK-NEXT: and w9, w0, #0x7
9+
; CHECK-NEXT: lsr w0, w8, w9
10+
; CHECK-NEXT: ret
11+
12+
%amt = and i32 %x, 7
13+
%y = shl i32 1, %amt
14+
%tr = trunc i32 %y to i8
15+
%div = udiv i8 %z, %tr
16+
ret i8 %div
17+
}
18+
19+
define i8 @pow2_trunc_orzero_false_maybezero(i32 %x, i8 %z){
20+
; CHECK-LABEL: pow2_trunc_orzero_false_maybezero:
21+
; CHECK: // %bb.0:
22+
; CHECK-NEXT: neg w8, w0
23+
; CHECK-NEXT: and w9, w1, #0xff
24+
; CHECK-NEXT: and w8, w0, w8
25+
; CHECK-NEXT: and w8, w8, #0xff
26+
; CHECK-NEXT: udiv w0, w9, w8
27+
; CHECK-NEXT: ret
28+
29+
%neg_x = sub i32 0, %x
30+
%y = and i32 %x, %neg_x
31+
%tr = trunc i32 %y to i8
32+
%div = udiv i8 %z, %tr
33+
ret i8 %div
34+
}

llvm/test/CodeGen/X86/known-pow2.ll

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,12 +1344,11 @@ define i32 @pow2_blsi_sub(i32 %x, i32 %a) {
13441344
define i8 @pow2_trunc(i32 %x, i32 %a){
13451345
; CHECK-LABEL: pow2_trunc:
13461346
; CHECK: # %bb.0:
1347-
; CHECK-NEXT: movl %esi, %ecx
1348-
; CHECK-NEXT: negl %ecx
1349-
; CHECK-NEXT: andl %esi, %ecx
1350-
; CHECK-NEXT: movzbl %dil, %eax
1351-
; CHECK-NEXT: divb %cl
1352-
; CHECK-NEXT: movzbl %ah, %eax
1347+
; CHECK-NEXT: movl %esi, %eax
1348+
; CHECK-NEXT: negl %eax
1349+
; CHECK-NEXT: andl %esi, %eax
1350+
; CHECK-NEXT: decb %al
1351+
; CHECK-NEXT: andb %dil, %al
13531352
; CHECK-NEXT: # kill: def $al killed $al killed $eax
13541353
; CHECK-NEXT: retq
13551354
%neg_a = sub i32 0, %a
@@ -1382,11 +1381,10 @@ define i8 @pow2_trunc_vec(<4 x i32> %x, <4 x i32> %a) {
13821381
; CHECK-NEXT: pxor %xmm2, %xmm2
13831382
; CHECK-NEXT: psubd %xmm1, %xmm2
13841383
; CHECK-NEXT: pand %xmm1, %xmm2
1385-
; CHECK-NEXT: movd %xmm2, %ecx
1386-
; CHECK-NEXT: movd %xmm0, %eax
1387-
; CHECK-NEXT: movzbl %al, %eax
1388-
; CHECK-NEXT: divb %cl
1389-
; CHECK-NEXT: movzbl %ah, %eax
1384+
; CHECK-NEXT: pcmpeqd %xmm1, %xmm1
1385+
; CHECK-NEXT: paddb %xmm2, %xmm1
1386+
; CHECK-NEXT: pand %xmm0, %xmm1
1387+
; CHECK-NEXT: movd %xmm1, %eax
13901388
; CHECK-NEXT: # kill: def $al killed $al killed $eax
13911389
; CHECK-NEXT: retq
13921390
%a.splat = shufflevector <4 x i32> %a, <4 x i32> poison, <4 x i32> zeroinitializer

0 commit comments

Comments
 (0)