diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index f31e1fa9ab304..8c64822c474b6 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -1160,6 +1160,10 @@ static std::optional instCombineSVECmpNE(InstCombiner &IC, IntrinsicInst &II) { LLVMContext &Ctx = II.getContext(); + // Replace by zero constant when all lanes are inactive + if (auto II_NA = instCombineSVENoActiveUnaryZero(IC, II)) + return II_NA; + // Check that the predicate is all active auto *Pg = dyn_cast(II.getArgOperand(0)); if (!Pg || Pg->getIntrinsicID() != Intrinsic::aarch64_sve_ptrue) @@ -2131,6 +2135,27 @@ AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC, case Intrinsic::aarch64_sve_st4: case Intrinsic::aarch64_sve_st4q: return instCombineSVENoActiveUnaryErase(IC, II, 4); + case Intrinsic::aarch64_sve_cmpeq: + case Intrinsic::aarch64_sve_cmpeq_wide: + case Intrinsic::aarch64_sve_cmpge: + case Intrinsic::aarch64_sve_cmpge_wide: + case Intrinsic::aarch64_sve_cmpgt: + case Intrinsic::aarch64_sve_cmpgt_wide: + case Intrinsic::aarch64_sve_cmphi: + case Intrinsic::aarch64_sve_cmphi_wide: + case Intrinsic::aarch64_sve_cmphs: + case Intrinsic::aarch64_sve_cmphs_wide: + case Intrinsic::aarch64_sve_cmple_wide: + case Intrinsic::aarch64_sve_cmplo_wide: + case Intrinsic::aarch64_sve_cmpls_wide: + case Intrinsic::aarch64_sve_cmplt_wide: + case Intrinsic::aarch64_sve_facge: + case Intrinsic::aarch64_sve_facgt: + case Intrinsic::aarch64_sve_fcmpeq: + case Intrinsic::aarch64_sve_fcmpge: + case Intrinsic::aarch64_sve_fcmpgt: + case Intrinsic::aarch64_sve_fcmpne: + case Intrinsic::aarch64_sve_fcmpuo: case Intrinsic::aarch64_sve_ld1_gather: case Intrinsic::aarch64_sve_ld1_gather_scalar_offset: case Intrinsic::aarch64_sve_ld1_gather_sxtw: diff --git a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-comb-no-active-lanes-cmp.ll b/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-comb-no-active-lanes-cmp.ll new file mode 100644 index 0000000000000..1833bb6db248d --- /dev/null +++ b/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-comb-no-active-lanes-cmp.ll @@ -0,0 +1,245 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -passes=instcombine < %s | FileCheck %s +target triple = "aarch64-unknown-linux-gnu" + +define @test_cmpeq( %a, %b){ +; CHECK-LABEL: define @test_cmpeq( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpeq.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmpeq_wide( %a, %b){ +; CHECK-LABEL: define @test_cmpeq_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpeq.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmpge( %a, %b){ +; CHECK-LABEL: define @test_cmpge( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpge.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmpge_wide( %a, %b){ +; CHECK-LABEL: define @test_cmpge_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpge.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmpgt( %a, %b){ +; CHECK-LABEL: define @test_cmpgt( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpgt.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmpgt_wide( %a, %b){ +; CHECK-LABEL: define @test_cmpgt_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpgt.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmphi( %a, %b){ +; CHECK-LABEL: define @test_cmphi( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmphi.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmphi_wide( %a, %b){ +; CHECK-LABEL: define @test_cmphi_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmphi.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmphs( %a, %b){ +; CHECK-LABEL: define @test_cmphs( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmphs.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmphs_wide( %a, %b){ +; CHECK-LABEL: define @test_cmphs_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmphs.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmple_wide( %a, %b){ +; CHECK-LABEL: define @test_cmple_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmple.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmplo_wide( %a, %b){ +; CHECK-LABEL: define @test_cmplo_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmplo.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmpls_wide( %a, %b){ +; CHECK-LABEL: define @test_cmpls_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpls.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmplt_wide( %a, %b){ +; CHECK-LABEL: define @test_cmplt_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmplt.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmpne( %a, %b){ +; CHECK-LABEL: define @test_cmpne( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpne.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_cmpne_wide( %a, %b){ +; CHECK-LABEL: define @test_cmpne_wide( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.cmpne.wide.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_facge( %a, %b){ry: + %0 = tail call @llvm.aarch64.sve.facge.nxv8f16( zeroinitializer, %a, %b) + ret %0 +} + +define @test_facgt( %a, %b){ry: + %0 = tail call @llvm.aarch64.sve.facgt.nxv8f16( zeroinitializer, %a, %b) + ret %0 +} + +define @test_fcmpeq( %a, %b){ +; CHECK-LABEL: define @test_fcmpeq( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.fcmpeq.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_fcmpge( %a, %b){ +; CHECK-LABEL: define @test_fcmpge( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.fcmpge.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_fcmpgt( %a, %b){ +; CHECK-LABEL: define @test_fcmpgt( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.fcmpgt.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_fcmpne( %a, %b){ +; CHECK-LABEL: define @test_fcmpne( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.fcmpne.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} + +define @test_fcmpuo( %a, %b){ +; CHECK-LABEL: define @test_fcmpuo( +; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: ret zeroinitializer +; +entry: + %0 = tail call @llvm.aarch64.sve.fcmpuo.nxv16i8( zeroinitializer, %a, %b) + ret %0 +} +