13
13
#include " AArch64MachineFunctionInfo.h"
14
14
#include " AArch64TargetMachine.h"
15
15
#include " MCTargetDesc/AArch64AddressingModes.h"
16
+ #include " MCTargetDesc/AArch64MCTargetDesc.h"
16
17
#include " llvm/ADT/APSInt.h"
17
18
#include " llvm/CodeGen/ISDOpcodes.h"
18
19
#include " llvm/CodeGen/SelectionDAGISel.h"
@@ -4558,9 +4559,19 @@ bool AArch64DAGToDAGISel::trySelectXAR(SDNode *N) {
4558
4559
!TLI->isAllActivePredicate (*CurDAG, N1.getOperand (0 )))
4559
4560
return false ;
4560
4561
4561
- SDValue XOR = N0.getOperand (1 );
4562
- if (XOR.getOpcode () != ISD::XOR || XOR != N1.getOperand (1 ))
4563
- return false ;
4562
+ SDValue R1, R2;
4563
+ if (N0.getOperand (1 ).getOpcode () != ISD::XOR) {
4564
+ if (N0.getOperand (1 ) != N1.getOperand (1 ))
4565
+ return false ;
4566
+ SDLoc DL (N1->getOperand (0 ));
4567
+ SDValue Zero =
4568
+ CurDAG->getConstant (0 , DL, N1->getOperand (0 ).getValueType ());
4569
+ R1 = N1->getOperand (0 );
4570
+ R2 = Zero;
4571
+ } else {
4572
+ R1 = N0.getOperand (1 );
4573
+ R2 = N1.getOperand (1 );
4574
+ }
4564
4575
4565
4576
APInt ShlAmt, ShrAmt;
4566
4577
if (!ISD::isConstantSplatVector (N0.getOperand (2 ).getNode (), ShlAmt) ||
@@ -4574,7 +4585,7 @@ bool AArch64DAGToDAGISel::trySelectXAR(SDNode *N) {
4574
4585
SDValue Imm =
4575
4586
CurDAG->getTargetConstant (ShrAmt.getZExtValue (), DL, MVT::i32 );
4576
4587
4577
- SDValue Ops[] = {XOR. getOperand ( 0 ), XOR. getOperand ( 1 ) , Imm};
4588
+ SDValue Ops[] = {R1, R2 , Imm};
4578
4589
if (auto Opc = SelectOpcodeFromVT<SelectTypeKind::Int>(
4579
4590
VT, {AArch64::XAR_ZZZI_B, AArch64::XAR_ZZZI_H, AArch64::XAR_ZZZI_S,
4580
4591
AArch64::XAR_ZZZI_D})) {
@@ -4591,13 +4602,20 @@ bool AArch64DAGToDAGISel::trySelectXAR(SDNode *N) {
4591
4602
N1->getOpcode () != AArch64ISD::VLSHR)
4592
4603
return false ;
4593
4604
4594
- if (N0->getOperand (0 ) != N1->getOperand (0 ) ||
4595
- N1->getOperand (0 )->getOpcode () != ISD::XOR)
4605
+ if (N0->getOperand (0 ) != N1->getOperand (0 ))
4596
4606
return false ;
4597
4607
4598
- SDValue XOR = N0.getOperand (0 );
4599
- SDValue R1 = XOR.getOperand (0 );
4600
- SDValue R2 = XOR.getOperand (1 );
4608
+ SDValue R1, R2;
4609
+ if (N1->getOperand (0 )->getOpcode () != ISD::XOR) {
4610
+ SDLoc DL (N1->getOperand (0 ));
4611
+ SDValue Zero = CurDAG->getConstant (0 , DL, N1->getOperand (0 ).getValueType ());
4612
+ R1 = N1->getOperand (0 );
4613
+ R2 = Zero;
4614
+ } else {
4615
+ SDValue XOR = N0.getOperand (0 );
4616
+ R1 = XOR.getOperand (0 );
4617
+ R2 = XOR.getOperand (1 );
4618
+ }
4601
4619
4602
4620
unsigned HsAmt = N0.getConstantOperandVal (1 );
4603
4621
unsigned ShAmt = N1.getConstantOperandVal (1 );
0 commit comments