Skip to content

Commit 354af47

Browse files
committed
[NewGVN] Don't use returned arg in memory defining intrinsics
1 parent c2765b7 commit 354af47

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

llvm/lib/Transforms/Scalar/NewGVN.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1647,7 +1647,9 @@ NewGVN::performSymbolicPredicateInfoEvaluation(BitCastInst *I) const {
16471647
NewGVN::ExprResult NewGVN::performSymbolicCallEvaluation(Instruction *I) const {
16481648
auto *CI = cast<CallInst>(I);
16491649
if (auto *II = dyn_cast<IntrinsicInst>(I)) {
1650-
if (auto *ReturnedValue = II->getReturnedArgOperand())
1650+
auto *ReturnedValue = II->getReturnedArgOperand();
1651+
auto *MemDef = dyn_cast_or_null<MemoryDef>(getMemoryAccess(I));
1652+
if (ReturnedValue && !MemDef)
16511653
return ExprResult::some(createVariableOrConstant(ReturnedValue));
16521654
}
16531655

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt -S -passes=newgvn < %s | FileCheck %s
3+
4+
; Don't use returned argument in memory defining intrinsics.
5+
define void @wombat(ptr %arg) {
6+
; CHECK-LABEL: define void @wombat(
7+
; CHECK-SAME: ptr [[ARG:%.*]]) {
8+
; CHECK-NEXT: [[LOAD:%.*]] = load ptr, ptr [[ARG]], align 8
9+
; CHECK-NEXT: [[CALL:%.*]] = call ptr @llvm.objc.retain(ptr [[LOAD]])
10+
; CHECK-NEXT: store ptr [[CALL]], ptr [[ARG]], align 8
11+
; CHECK-NEXT: ret void
12+
;
13+
%load = load ptr, ptr %arg, align 8
14+
%call = call ptr @llvm.objc.retain(ptr %load)
15+
store ptr %call, ptr %arg, align 8
16+
ret void
17+
}
18+
19+
declare ptr @llvm.objc.retain(ptr returned) #0
20+
21+
attributes #0 = { nounwind }

0 commit comments

Comments
 (0)