Skip to content

Commit 3642568

Browse files
author
git apple-llvm automerger
committed
Merge commit '85a6bedf00e9' from llvm.org/main into next
2 parents 5edfb3a + 85a6bed commit 3642568

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,14 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
223223
}
224224
break;
225225
}
226+
case TargetOpcode::G_SPLAT_VECTOR: {
227+
computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, APInt(1, 1),
228+
Depth + 1);
229+
// Implicitly truncate the bits to match the official semantics of
230+
// G_SPLAT_VECTOR.
231+
Known = Known.trunc(BitWidth);
232+
break;
233+
}
226234
case TargetOpcode::COPY:
227235
case TargetOpcode::G_PHI:
228236
case TargetOpcode::PHI: {
@@ -904,6 +912,15 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
904912
}
905913
break;
906914
}
915+
case TargetOpcode::G_SPLAT_VECTOR: {
916+
// Check if the sign bits of source go down as far as the truncated value.
917+
Register Src = MI.getOperand(1).getReg();
918+
unsigned NumSrcSignBits = computeNumSignBits(Src, APInt(1, 1), Depth + 1);
919+
unsigned NumSrcBits = MRI.getType(Src).getSizeInBits();
920+
if (NumSrcSignBits > (NumSrcBits - TyBits))
921+
return NumSrcSignBits - (NumSrcBits - TyBits);
922+
break;
923+
}
907924
case TargetOpcode::G_INTRINSIC:
908925
case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
909926
case TargetOpcode::G_INTRINSIC_CONVERGENT:
@@ -939,7 +956,7 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
939956
unsigned GISelValueTracking::computeNumSignBits(Register R, unsigned Depth) {
940957
LLT Ty = MRI.getType(R);
941958
APInt DemandedElts =
942-
Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
959+
Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
943960
return computeNumSignBits(R, DemandedElts, Depth);
944961
}
945962

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple aarch64 -mattr=+sve -passes="print<gisel-value-tracking>" %s -o - 2>&1 | FileCheck %s
3+
4+
---
5+
name: Scalable
6+
body: |
7+
bb.1:
8+
; CHECK-LABEL: name: @Scalable
9+
; CHECK-NEXT: %0:_ KnownBits:0000000000001010 SignBits:12
10+
; CHECK-NEXT: %1:_ KnownBits:0000000000001010 SignBits:12
11+
%0:_(s16) = G_CONSTANT i16 10
12+
%1:_(<vscale x 8 x s16>) = G_SPLAT_VECTOR %0(s16)
13+
...
14+
---
15+
name: Scalable_trunc
16+
body: |
17+
bb.1:
18+
; CHECK-LABEL: name: @Scalable_trunc
19+
; CHECK-NEXT: %0:_ KnownBits:00000000000000000000000000001010 SignBits:28
20+
; CHECK-NEXT: %1:_ KnownBits:0000000000001010 SignBits:12
21+
%0:_(s32) = G_CONSTANT i32 10
22+
%1:_(<vscale x 8 x s16>) = G_SPLAT_VECTOR %0(s32)
23+
...
24+
---
25+
name: Scalable_signbits
26+
body: |
27+
bb.1:
28+
; CHECK-LABEL: name: @Scalable_signbits
29+
; CHECK-NEXT: %0:_ KnownBits:???????????????? SignBits:1
30+
; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:17
31+
; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:17
32+
%0:_(s16) = COPY $h0
33+
%1:_(s32) = G_SEXT %0(s16)
34+
%2:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %1(s32)
35+
...

0 commit comments

Comments
 (0)