Skip to content

Commit 38bedfe

Browse files
committed
[AArch64] AArch64TargetLowering::computeKnownBitsForTargetNode - add support for AArch64ISD::MOV/MVN constants
1 parent 916218c commit 38bedfe

File tree

3 files changed

+96
-8
lines changed

3 files changed

+96
-8
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2619,6 +2619,32 @@ void AArch64TargetLowering::computeKnownBitsForTargetNode(
26192619
<< Op->getConstantOperandVal(1)));
26202620
break;
26212621
}
2622+
case AArch64ISD::MOVImsl: {
2623+
Known = KnownBits::makeConstant(
2624+
APInt(Known.getBitWidth(), ~(~Op->getConstantOperandVal(0)
2625+
<< Op->getConstantOperandVal(1))));
2626+
break;
2627+
}
2628+
case AArch64ISD::MOVIedit: {
2629+
Known = KnownBits::makeConstant(APInt(
2630+
Known.getBitWidth(),
2631+
AArch64_AM::decodeAdvSIMDModImmType10(Op->getConstantOperandVal(0))));
2632+
break;
2633+
}
2634+
case AArch64ISD::MVNIshift: {
2635+
Known = KnownBits::makeConstant(
2636+
APInt(Known.getBitWidth(),
2637+
(~Op->getConstantOperandVal(0) << Op->getConstantOperandVal(1)),
2638+
false, true));
2639+
break;
2640+
}
2641+
case AArch64ISD::MVNImsl: {
2642+
Known = KnownBits::makeConstant(
2643+
APInt(Known.getBitWidth(),
2644+
~(Op->getConstantOperandVal(0) << Op->getConstantOperandVal(1)),
2645+
false, true));
2646+
break;
2647+
}
26222648
case AArch64ISD::LOADgot:
26232649
case AArch64ISD::ADDlow: {
26242650
if (!Subtarget->isTargetILP32())
@@ -30637,6 +30663,10 @@ bool AArch64TargetLowering::isTargetCanonicalConstantNode(SDValue Op) const {
3063730663
return Op.getOpcode() == AArch64ISD::DUP ||
3063830664
Op.getOpcode() == AArch64ISD::MOVI ||
3063930665
Op.getOpcode() == AArch64ISD::MOVIshift ||
30666+
Op.getOpcode() == AArch64ISD::MOVImsl ||
30667+
Op.getOpcode() == AArch64ISD::MOVIedit ||
30668+
Op.getOpcode() == AArch64ISD::MVNIshift ||
30669+
Op.getOpcode() == AArch64ISD::MVNImsl ||
3064030670
(Op.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
3064130671
Op.getOperand(0).getOpcode() == AArch64ISD::DUP) ||
3064230672
TargetLowering::isTargetCanonicalConstantNode(Op);

llvm/test/CodeGen/AArch64/urem-vector-lkk.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ define <4 x i16> @fold_urem_vec_1(<4 x i16> %x) {
88
; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI0_0]
99
; CHECK-NEXT: adrp x8, .LCPI0_1
1010
; CHECK-NEXT: ldr d2, [x8, :lo12:.LCPI0_1]
11-
; CHECK-NEXT: adrp x8, .LCPI0_2
12-
; CHECK-NEXT: ushl v1.4h, v0.4h, v1.4h
13-
; CHECK-NEXT: umull v1.4s, v1.4h, v2.4h
14-
; CHECK-NEXT: movi d2, #0000000000000000
15-
; CHECK-NEXT: shrn v1.4h, v1.4s, #16
16-
; CHECK-NEXT: fneg d2, d2
17-
; CHECK-NEXT: sub v3.4h, v0.4h, v1.4h
18-
; CHECK-NEXT: umull v2.4s, v3.4h, v2.4h
11+
; CHECK-NEXT: mov x8, #-9223372036854775808 // =0x8000000000000000
12+
; CHECK-NEXT: ushl v1.4h, v0.4h, v1.4h
13+
; CHECK-NEXT: fmov d3, x8
14+
; CHECK-NEXT: adrp x8, .LCPI0_2
15+
; CHECK-NEXT: umull v1.4s, v1.4h, v2.4h
16+
; CHECK-NEXT: shrn v1.4h, v1.4s, #16
17+
; CHECK-NEXT: sub v2.4h, v0.4h, v1.4h
18+
; CHECK-NEXT: umull v2.4s, v2.4h, v3.4h
1919
; CHECK-NEXT: shrn v2.4h, v2.4s, #16
2020
; CHECK-NEXT: add v1.4h, v2.4h, v1.4h
2121
; CHECK-NEXT: ldr d2, [x8, :lo12:.LCPI0_2]

llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,64 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_UADDO_CARRY) {
318318
EXPECT_EQ(Known.One, APInt(8, 0x86));
319319
}
320320

321+
// Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
322+
TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_MOVI) {
323+
SDLoc Loc;
324+
auto Int8VT = EVT::getIntegerVT(Context, 8);
325+
auto Int16VT = EVT::getIntegerVT(Context, 16);
326+
auto Int32VT = EVT::getIntegerVT(Context, 32);
327+
auto Int64VT = EVT::getIntegerVT(Context, 64);
328+
auto N0 = DAG->getConstant(0xA5, Loc, Int8VT);
329+
KnownBits Known;
330+
331+
auto OpMOVIedit = DAG->getNode(AArch64ISD::MOVIedit, Loc, Int64VT, N0);
332+
Known = DAG->computeKnownBits(OpMOVIedit);
333+
EXPECT_EQ(Known.Zero, APInt(64, 0x00FF00FFFF00FF00));
334+
EXPECT_EQ(Known.One, APInt(64, 0xFF00FF0000FF00FF));
335+
336+
auto N1 = DAG->getConstant(16, Loc, Int8VT);
337+
auto OpMOVImsl = DAG->getNode(AArch64ISD::MOVImsl, Loc, Int32VT, N0, N1);
338+
Known = DAG->computeKnownBits(OpMOVImsl);
339+
EXPECT_EQ(Known.Zero, APInt(32, 0xFF5A0000));
340+
EXPECT_EQ(Known.One, APInt(32, 0x00A5FFFF));
341+
342+
auto OpMVNImsl = DAG->getNode(AArch64ISD::MVNImsl, Loc, Int32VT, N0, N1);
343+
Known = DAG->computeKnownBits(OpMVNImsl);
344+
EXPECT_EQ(Known.Zero, APInt(32, 0x00A50000));
345+
EXPECT_EQ(Known.One, APInt(32, 0xFF5AFFFF));
346+
347+
auto N2 = DAG->getConstant(16, Loc, Int8VT);
348+
auto OpMOVIshift32 =
349+
DAG->getNode(AArch64ISD::MOVIshift, Loc, Int32VT, N0, N2);
350+
Known = DAG->computeKnownBits(OpMOVIshift32);
351+
EXPECT_EQ(Known.Zero, APInt(32, 0xFF5AFFFF));
352+
EXPECT_EQ(Known.One, APInt(32, 0x00A50000));
353+
354+
auto OpMVNIshift32 =
355+
DAG->getNode(AArch64ISD::MVNIshift, Loc, Int32VT, N0, N2);
356+
Known = DAG->computeKnownBits(OpMVNIshift32);
357+
EXPECT_EQ(Known.Zero, APInt(32, 0x00A5FFFF));
358+
EXPECT_EQ(Known.One, APInt(32, 0xFF5A0000));
359+
360+
auto N3 = DAG->getConstant(8, Loc, Int8VT);
361+
auto OpMOVIshift16 =
362+
DAG->getNode(AArch64ISD::MOVIshift, Loc, Int16VT, N0, N3);
363+
Known = DAG->computeKnownBits(OpMOVIshift16);
364+
EXPECT_EQ(Known.One, APInt(16, 0xA500));
365+
EXPECT_EQ(Known.Zero, APInt(16, 0x5AFF));
366+
367+
auto OpMVNIshift16 =
368+
DAG->getNode(AArch64ISD::MVNIshift, Loc, Int16VT, N0, N3);
369+
Known = DAG->computeKnownBits(OpMVNIshift16);
370+
EXPECT_EQ(Known.Zero, APInt(16, 0xA5FF));
371+
EXPECT_EQ(Known.One, APInt(16, 0x5A00));
372+
373+
auto OpMOVI = DAG->getNode(AArch64ISD::MOVI, Loc, Int8VT, N0);
374+
Known = DAG->computeKnownBits(OpMOVI);
375+
EXPECT_EQ(Known.Zero, APInt(8, 0x5A));
376+
EXPECT_EQ(Known.One, APInt(8, 0xA5));
377+
}
378+
321379
// Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
322380
TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_SUB) {
323381
SDLoc Loc;

0 commit comments

Comments
 (0)