Skip to content

Commit 9aeb333

Browse files
[AArch64] Ensure SplatBitSize conforms with the original lane width
A miscompilation issue has been addressed with improved checking. Fixes: #75822.
1 parent 970152b commit 9aeb333

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13708,15 +13708,18 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
1370813708

1370913709
APInt SplatValue;
1371013710
APInt SplatUndef;
13711-
unsigned SplatBitSize;
13711+
unsigned SplatBitSize = 0;
1371213712
bool HasAnyUndefs;
1371313713

1371413714
BuildVectorSDNode *BVN = dyn_cast<BuildVectorSDNode>(RHS.getNode());
1371513715
bool IsCnst = BVN && BVN->isConstantSplat(SplatValue, SplatUndef,
1371613716
SplatBitSize, HasAnyUndefs);
13717-
bool IsZero = IsCnst && SplatValue == 0;
13718-
bool IsOne = IsCnst && SplatValue == 1;
13719-
bool IsMinusOne = IsCnst && SplatValue.isAllOnes();
13717+
13718+
bool IsSplatUniform =
13719+
SrcVT.getVectorElementType().getSizeInBits() >= SplatBitSize;
13720+
bool IsZero = IsCnst && SplatValue == 0 && IsSplatUniform;
13721+
bool IsOne = IsCnst && SplatValue == 1 && IsSplatUniform;
13722+
bool IsMinusOne = IsCnst && SplatValue.isAllOnes() && IsSplatUniform;
1372013723

1372113724
if (SrcVT.getVectorElementType().isFloatingPoint()) {
1372213725
switch (CC) {

llvm/test/CodeGen/AArch64/neon-compare-instructions.ll

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,6 +1772,23 @@ define <2 x i64> @cmltz2xi64(<2 x i64> %A) {
17721772
ret <2 x i64> %tmp4
17731773
}
17741774

1775+
define <8 x i1> @not_cmle8xi8(<8 x i8> %0) {
1776+
; CHECK-SD-LABEL: not_cmle8xi8:
1777+
; CHECK-SD: // %bb.0:
1778+
; CHECK-SD-NEXT: movi v1.2s, #1
1779+
; CHECK-SD-NEXT: cmgt v0.8b, v1.8b, v0.8b
1780+
; CHECK-SD-NEXT: ret
1781+
;
1782+
; CHECK-GI-LABEL: not_cmle8xi8:
1783+
; CHECK-GI: // %bb.0:
1784+
; CHECK-GI-NEXT: adrp x8, .LCPI133_0
1785+
; CHECK-GI-NEXT: ldr d1, [x8, :lo12:.LCPI133_0]
1786+
; CHECK-GI-NEXT: cmgt v0.8b, v1.8b, v0.8b
1787+
; CHECK-GI-NEXT: ret
1788+
%cmp.i = icmp slt <8 x i8> %0, <i8 1, i8 0, i8 0, i8 0, i8 1, i8 0, i8 0, i8 0>
1789+
ret <8 x i1> %cmp.i
1790+
}
1791+
17751792
define <8 x i8> @cmltz8xi8_alt(<8 x i8> %A) {
17761793
; CHECK-SD-LABEL: cmltz8xi8_alt:
17771794
; CHECK-SD: // %bb.0:
@@ -2065,8 +2082,8 @@ define <2 x i64> @cmhsz2xi64(<2 x i64> %A) {
20652082
;
20662083
; CHECK-GI-LABEL: cmhsz2xi64:
20672084
; CHECK-GI: // %bb.0:
2068-
; CHECK-GI-NEXT: adrp x8, .LCPI153_0
2069-
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI153_0]
2085+
; CHECK-GI-NEXT: adrp x8, .LCPI154_0
2086+
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI154_0]
20702087
; CHECK-GI-NEXT: cmhs v0.2d, v0.2d, v1.2d
20712088
; CHECK-GI-NEXT: ret
20722089
%tmp3 = icmp uge <2 x i64> %A, <i64 2, i64 2>
@@ -2151,8 +2168,8 @@ define <2 x i64> @cmhiz2xi64(<2 x i64> %A) {
21512168
;
21522169
; CHECK-GI-LABEL: cmhiz2xi64:
21532170
; CHECK-GI: // %bb.0:
2154-
; CHECK-GI-NEXT: adrp x8, .LCPI160_0
2155-
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI160_0]
2171+
; CHECK-GI-NEXT: adrp x8, .LCPI161_0
2172+
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI161_0]
21562173
; CHECK-GI-NEXT: cmhi v0.2d, v0.2d, v1.2d
21572174
; CHECK-GI-NEXT: ret
21582175
%tmp3 = icmp ugt <2 x i64> %A, <i64 1, i64 1>
@@ -2327,8 +2344,8 @@ define <2 x i64> @cmloz2xi64(<2 x i64> %A) {
23272344
;
23282345
; CHECK-GI-LABEL: cmloz2xi64:
23292346
; CHECK-GI: // %bb.0:
2330-
; CHECK-GI-NEXT: adrp x8, .LCPI174_0
2331-
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI174_0]
2347+
; CHECK-GI-NEXT: adrp x8, .LCPI175_0
2348+
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI175_0]
23322349
; CHECK-GI-NEXT: cmhi v0.2d, v1.2d, v0.2d
23332350
; CHECK-GI-NEXT: ret
23342351
%tmp3 = icmp ult <2 x i64> %A, <i64 2, i64 2>

0 commit comments

Comments
 (0)