File tree Expand file tree Collapse file tree 2 files changed +24
-1
lines changed
Expand file tree Collapse file tree 2 files changed +24
-1
lines changed Original file line number Diff line number Diff line change @@ -1647,7 +1647,9 @@ NewGVN::performSymbolicPredicateInfoEvaluation(BitCastInst *I) const {
16471647NewGVN::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
Original file line number Diff line number Diff line change 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 }
You can’t perform that action at this time.
0 commit comments