Index: llvm/lib/Target/ARM/ARMISelLowering.h =================================================================== --- llvm/lib/Target/ARM/ARMISelLowering.h +++ llvm/lib/Target/ARM/ARMISelLowering.h @@ -738,6 +738,9 @@ bool shouldFoldConstantShiftPairToMask(const SDNode *N, CombineLevel Level) const override; + bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, + EVT VT) const override; + bool preferIncOfAddToSubOfNot(EVT VT) const override; bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const override; Index: llvm/lib/Target/ARM/ARMISelLowering.cpp =================================================================== --- llvm/lib/Target/ARM/ARMISelLowering.cpp +++ llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -13787,6 +13787,11 @@ return false; } +bool ARMTargetLowering::shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, + EVT VT) const { + return Subtarget->hasMVEIntegerOps() && isTypeLegal(VT); +} + bool ARMTargetLowering::preferIncOfAddToSubOfNot(EVT VT) const { if (!Subtarget->hasNEON()) { if (Subtarget->isThumb1Only()) Index: llvm/test/CodeGen/Thumb2/mve-pred-selectop3.ll =================================================================== --- llvm/test/CodeGen/Thumb2/mve-pred-selectop3.ll +++ llvm/test/CodeGen/Thumb2/mve-pred-selectop3.ll @@ -256,10 +256,9 @@ define arm_aapcs_vfpcc <4 x i32> @andnot_v4i32_x(<4 x i32> %x, <4 x i32> %y, i32 %n) { ; CHECK-LABEL: andnot_v4i32_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vmvn q1, q1 ; CHECK-NEXT: vctp.32 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vandt q0, q0, q1 +; CHECK-NEXT: vbict q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <4 x i1> @llvm.arm.mve.vctp32(i32 %n) @@ -272,10 +271,9 @@ define arm_aapcs_vfpcc <8 x i16> @andnot_v8i16_x(<8 x i16> %x, <8 x i16> %y, i32 %n) { ; CHECK-LABEL: andnot_v8i16_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vmvn q1, q1 ; CHECK-NEXT: vctp.16 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vandt q0, q0, q1 +; CHECK-NEXT: vbict q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <8 x i1> @llvm.arm.mve.vctp16(i32 %n) @@ -288,10 +286,9 @@ define arm_aapcs_vfpcc <16 x i8> @andnot_v16i8_x(<16 x i8> %x, <16 x i8> %y, i32 %n) { ; CHECK-LABEL: andnot_v16i8_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vmvn q1, q1 ; CHECK-NEXT: vctp.8 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vandt q0, q0, q1 +; CHECK-NEXT: vbict q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <16 x i1> @llvm.arm.mve.vctp8(i32 %n) @@ -304,10 +301,9 @@ define arm_aapcs_vfpcc <4 x i32> @ornot_v4i32_x(<4 x i32> %x, <4 x i32> %y, i32 %n) { ; CHECK-LABEL: ornot_v4i32_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vmvn q1, q1 ; CHECK-NEXT: vctp.32 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vorrt q0, q0, q1 +; CHECK-NEXT: vornt q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <4 x i1> @llvm.arm.mve.vctp32(i32 %n) @@ -320,10 +316,9 @@ define arm_aapcs_vfpcc <8 x i16> @ornot_v8i16_x(<8 x i16> %x, <8 x i16> %y, i32 %n) { ; CHECK-LABEL: ornot_v8i16_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vmvn q1, q1 ; CHECK-NEXT: vctp.16 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vorrt q0, q0, q1 +; CHECK-NEXT: vornt q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <8 x i1> @llvm.arm.mve.vctp16(i32 %n) @@ -336,10 +331,9 @@ define arm_aapcs_vfpcc <16 x i8> @ornot_v16i8_x(<16 x i8> %x, <16 x i8> %y, i32 %n) { ; CHECK-LABEL: ornot_v16i8_x: ; CHECK: @ %bb.0: @ %entry -; CHECK-NEXT: vmvn q1, q1 ; CHECK-NEXT: vctp.8 r0 ; CHECK-NEXT: vpst -; CHECK-NEXT: vorrt q0, q0, q1 +; CHECK-NEXT: vornt q0, q0, q1 ; CHECK-NEXT: bx lr entry: %c = call <16 x i1> @llvm.arm.mve.vctp8(i32 %n) @@ -2317,7 +2311,7 @@ ; CHECK-NEXT: vdup.32 q1, r0 ; CHECK-NEXT: vctp.32 r1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vaddt.i32 q1, q1, q0 +; CHECK-NEXT: vaddt.i32 q1, q0, r0 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -2335,7 +2329,7 @@ ; CHECK-NEXT: vdup.16 q1, r0 ; CHECK-NEXT: vctp.16 r1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vaddt.i16 q1, q1, q0 +; CHECK-NEXT: vaddt.i16 q1, q0, r0 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -2353,7 +2347,7 @@ ; CHECK-NEXT: vdup.8 q1, r0 ; CHECK-NEXT: vctp.8 r1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vaddt.i8 q1, q1, q0 +; CHECK-NEXT: vaddt.i8 q1, q0, r0 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -2425,7 +2419,7 @@ ; CHECK-NEXT: vdup.32 q1, r0 ; CHECK-NEXT: vctp.32 r1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmult.i32 q1, q1, q0 +; CHECK-NEXT: vmult.i32 q1, q0, r0 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -2443,7 +2437,7 @@ ; CHECK-NEXT: vdup.16 q1, r0 ; CHECK-NEXT: vctp.16 r1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmult.i16 q1, q1, q0 +; CHECK-NEXT: vmult.i16 q1, q0, r0 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -2461,7 +2455,7 @@ ; CHECK-NEXT: vdup.8 q1, r0 ; CHECK-NEXT: vctp.8 r1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmult.i8 q1, q1, q0 +; CHECK-NEXT: vmult.i8 q1, q0, r0 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -2556,7 +2550,7 @@ ; CHECK-NEXT: vctp.32 r0 ; CHECK-NEXT: vdup.32 q1, r1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmult.f32 q1, q1, q0 +; CHECK-NEXT: vmult.f32 q1, q0, r1 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: @@ -2575,7 +2569,7 @@ ; CHECK-NEXT: vctp.16 r0 ; CHECK-NEXT: vdup.16 q1, r1 ; CHECK-NEXT: vpst -; CHECK-NEXT: vmult.f16 q1, q1, q0 +; CHECK-NEXT: vmult.f16 q1, q0, r1 ; CHECK-NEXT: vmov q0, q1 ; CHECK-NEXT: bx lr entry: