From 354af47a7ad559c4aad9b4b278b2649885aab12d Mon Sep 17 00:00:00 2001 From: ManuelJBrito Date: Fri, 3 Oct 2025 16:24:56 +0100 Subject: [PATCH 1/2] [NewGVN] Don't use returned arg in memory defining intrinsics --- llvm/lib/Transforms/Scalar/NewGVN.cpp | 4 +++- llvm/test/Transforms/NewGVN/pr159918.ll | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Transforms/NewGVN/pr159918.ll diff --git a/llvm/lib/Transforms/Scalar/NewGVN.cpp b/llvm/lib/Transforms/Scalar/NewGVN.cpp index 9d4fb79416596..561c5341e57de 100644 --- a/llvm/lib/Transforms/Scalar/NewGVN.cpp +++ b/llvm/lib/Transforms/Scalar/NewGVN.cpp @@ -1647,7 +1647,9 @@ NewGVN::performSymbolicPredicateInfoEvaluation(BitCastInst *I) const { NewGVN::ExprResult NewGVN::performSymbolicCallEvaluation(Instruction *I) const { auto *CI = cast(I); if (auto *II = dyn_cast(I)) { - if (auto *ReturnedValue = II->getReturnedArgOperand()) + auto *ReturnedValue = II->getReturnedArgOperand(); + auto *MemDef = dyn_cast_or_null(getMemoryAccess(I)); + if (ReturnedValue && !MemDef) return ExprResult::some(createVariableOrConstant(ReturnedValue)); } diff --git a/llvm/test/Transforms/NewGVN/pr159918.ll b/llvm/test/Transforms/NewGVN/pr159918.ll new file mode 100644 index 0000000000000..3fad6e66d11ac --- /dev/null +++ b/llvm/test/Transforms/NewGVN/pr159918.ll @@ -0,0 +1,21 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -S -passes=newgvn < %s | FileCheck %s + +; Don't use returned argument in memory defining intrinsics. +define void @wombat(ptr %arg) { +; CHECK-LABEL: define void @wombat( +; CHECK-SAME: ptr [[ARG:%.*]]) { +; CHECK-NEXT: [[LOAD:%.*]] = load ptr, ptr [[ARG]], align 8 +; CHECK-NEXT: [[CALL:%.*]] = call ptr @llvm.objc.retain(ptr [[LOAD]]) +; CHECK-NEXT: store ptr [[CALL]], ptr [[ARG]], align 8 +; CHECK-NEXT: ret void +; + %load = load ptr, ptr %arg, align 8 + %call = call ptr @llvm.objc.retain(ptr %load) + store ptr %call, ptr %arg, align 8 + ret void +} + +declare ptr @llvm.objc.retain(ptr returned) #0 + +attributes #0 = { nounwind } From c587292c4533399404b3904117bc5a2c23ffe858 Mon Sep 17 00:00:00 2001 From: ManuelJBrito <59119670+ManuelJBrito@users.noreply.github.com> Date: Fri, 3 Oct 2025 16:57:27 +0100 Subject: [PATCH 2/2] Update NewGVN.cpp --- llvm/lib/Transforms/Scalar/NewGVN.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/NewGVN.cpp b/llvm/lib/Transforms/Scalar/NewGVN.cpp index 561c5341e57de..d6b76335dbb9f 100644 --- a/llvm/lib/Transforms/Scalar/NewGVN.cpp +++ b/llvm/lib/Transforms/Scalar/NewGVN.cpp @@ -1646,12 +1646,6 @@ NewGVN::performSymbolicPredicateInfoEvaluation(BitCastInst *I) const { // Evaluate read only and pure calls, and create an expression result. NewGVN::ExprResult NewGVN::performSymbolicCallEvaluation(Instruction *I) const { auto *CI = cast(I); - if (auto *II = dyn_cast(I)) { - auto *ReturnedValue = II->getReturnedArgOperand(); - auto *MemDef = dyn_cast_or_null(getMemoryAccess(I)); - if (ReturnedValue && !MemDef) - return ExprResult::some(createVariableOrConstant(ReturnedValue)); - } // FIXME: Currently the calls which may access the thread id may // be considered as not accessing the memory. But this is