diff --git a/llvm/lib/Target/AArch64/SVEIntrinsicOpts.cpp b/llvm/lib/Target/AArch64/SVEIntrinsicOpts.cpp index 74fe0cdd1ea7f..0245dd1d611a8 100644 --- a/llvm/lib/Target/AArch64/SVEIntrinsicOpts.cpp +++ b/llvm/lib/Target/AArch64/SVEIntrinsicOpts.cpp @@ -160,7 +160,7 @@ bool SVEIntrinsicOpts::optimizePTest(IntrinsicInst *I) { I->eraseFromParent(); if (Op1->use_empty()) Op1->eraseFromParent(); - if (Op2->use_empty()) + if (Op1 != Op2 && Op2->use_empty()) Op2->eraseFromParent(); return true; diff --git a/llvm/test/CodeGen/AArch64/sve-intrinsic-opts-ptest.ll b/llvm/test/CodeGen/AArch64/sve-intrinsic-opts-ptest.ll index 191fddacffd1d..9af34676b3421 100644 --- a/llvm/test/CodeGen/AArch64/sve-intrinsic-opts-ptest.ll +++ b/llvm/test/CodeGen/AArch64/sve-intrinsic-opts-ptest.ll @@ -44,6 +44,16 @@ define i1 @ptest_first( %a) { ret i1 %out } +define i1 @ptest_first_same_ops( %a) { +; OPT-LABEL: ptest_first_same_ops +; OPT: %[[OUT:.*]] = call i1 @llvm.aarch64.sve.ptest.first.nxv2i1( %a, %a) +; OPT-NOT: convert +; OPT-NEXT: ret i1 %[[OUT]] + %1 = tail call @llvm.aarch64.sve.convert.to.svbool.nxv2i1( %a) + %2 = tail call i1 @llvm.aarch64.sve.ptest.first.nxv16i1( %1, %1) + ret i1 %2 +} + define i1 @ptest_last( %a) { ; OPT-LABEL: ptest_last ; OPT: %mask = tail call @llvm.aarch64.sve.ptrue.nxv8i1(i32 0)