Skip to content

Commit 711d72e

Browse files
[LLVM][SVE] Relax optimizeIncrementingWhile constant operand requirements. (#140037)
Only the latter part of optimizeIncrementingWhile requires a constant first operand and so the initial bailout code is preventing the obvious whilele(X,MAX_INT) -> splat(true) combine.
1 parent 882a4c5 commit 711d72e

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5744,12 +5744,10 @@ static SDValue optimizeIncrementingWhile(SDNode *N, SelectionDAG &DAG,
57445744
unsigned Op0 = N->getOpcode() == ISD::INTRINSIC_WO_CHAIN ? 1 : 0;
57455745
unsigned Op1 = N->getOpcode() == ISD::INTRINSIC_WO_CHAIN ? 2 : 1;
57465746

5747-
if (!isa<ConstantSDNode>(N->getOperand(Op0)) ||
5748-
!isa<ConstantSDNode>(N->getOperand(Op1)))
5747+
if (!isa<ConstantSDNode>(N->getOperand(Op1)))
57495748
return SDValue();
57505749

57515750
SDLoc dl(N);
5752-
APInt X = N->getConstantOperandAPInt(Op0);
57535751
APInt Y = N->getConstantOperandAPInt(Op1);
57545752

57555753
// When the second operand is the maximum value, comparisons that include
@@ -5758,6 +5756,11 @@ static SDValue optimizeIncrementingWhile(SDNode *N, SelectionDAG &DAG,
57585756
if (IsSigned ? Y.isMaxSignedValue() : Y.isMaxValue())
57595757
return DAG.getConstant(1, dl, N->getValueType(0));
57605758

5759+
if (!isa<ConstantSDNode>(N->getOperand(Op0)))
5760+
return SDValue();
5761+
5762+
APInt X = N->getConstantOperandAPInt(Op0);
5763+
57615764
bool Overflow;
57625765
APInt NumActiveElems =
57635766
IsSigned ? Y.ssub_ov(X, Overflow) : Y.usub_ov(X, Overflow);

llvm/test/CodeGen/AArch64/sve-intrinsics-while.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ define <vscale x 16 x i1> @whilele_b_ii_dont_fold_to_ptrue_overflow() {
128128
ret <vscale x 16 x i1> %out
129129
}
130130

131-
define <vscale x 16 x i1> @whilele_b_ii_known_always_true() {
131+
define <vscale x 16 x i1> @whilele_b_ii_known_always_true(i32 %a) {
132132
; CHECK-LABEL: whilele_b_ii_known_always_true:
133133
; CHECK: // %bb.0:
134134
; CHECK-NEXT: ptrue p0.b
135135
; CHECK-NEXT: ret
136-
%out = call <vscale x 16 x i1> @llvm.aarch64.sve.whilele.nxv16i1.i32(i32 2147483646, i32 2147483647)
136+
%out = call <vscale x 16 x i1> @llvm.aarch64.sve.whilele.nxv16i1.i32(i32 %a, i32 2147483647)
137137
ret <vscale x 16 x i1> %out
138138
}
139139

@@ -387,12 +387,12 @@ define <vscale x 16 x i1> @whilels_b_ii_dont_fold_to_ptrue_overflow() {
387387
ret <vscale x 16 x i1> %out
388388
}
389389

390-
define <vscale x 16 x i1> @whilels_b_ii_known_always_true() {
390+
define <vscale x 16 x i1> @whilels_b_ii_known_always_true(i32 %a) {
391391
; CHECK-LABEL: whilels_b_ii_known_always_true:
392392
; CHECK: // %bb.0:
393393
; CHECK-NEXT: ptrue p0.b
394394
; CHECK-NEXT: ret
395-
%out = call <vscale x 16 x i1> @llvm.aarch64.sve.whilels.nxv16i1.i32(i32 4294967294, i32 4294967295)
395+
%out = call <vscale x 16 x i1> @llvm.aarch64.sve.whilels.nxv16i1.i32(i32 %a, i32 4294967295)
396396
ret <vscale x 16 x i1> %out
397397
}
398398

0 commit comments

Comments
 (0)