[llvm] r350261 - Fix assert in ObjCARC optimizer when deleting retainBlock of null or undef.

Pete Cooper via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 2 13:00:02 PST 2019


Author: pete
Date: Wed Jan  2 13:00:02 2019
New Revision: 350261

URL: http://llvm.org/viewvc/llvm-project?rev=350261&view=rev
Log:
Fix assert in ObjCARC optimizer when deleting retainBlock of null or undef.

The caller to EraseInstruction had this conditional:

    // ARC calls with null are no-ops. Delete them.
    if (IsNullOrUndef(Arg))

but the assert inside EraseInstruction only allowed ConstantPointerNull and not
undef or bitcasts.

This adds support for both of these cases.

rdar://problem/47003805

Modified:
    llvm/trunk/lib/Transforms/ObjCARC/ObjCARC.h
    llvm/trunk/test/Transforms/ObjCARC/rv.ll

Modified: llvm/trunk/lib/Transforms/ObjCARC/ObjCARC.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/ObjCARC/ObjCARC.h?rev=350261&r1=350260&r2=350261&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/ObjCARC/ObjCARC.h (original)
+++ llvm/trunk/lib/Transforms/ObjCARC/ObjCARC.h Wed Jan  2 13:00:02 2019
@@ -58,7 +58,7 @@ static inline void EraseInstruction(Inst
     // Replace the return value with the argument.
     assert((IsForwarding(GetBasicARCInstKind(CI)) ||
             (IsNoopOnNull(GetBasicARCInstKind(CI)) &&
-             isa<ConstantPointerNull>(OldArg))) &&
+             IsNullOrUndef(OldArg->stripPointerCasts()))) &&
            "Can't delete non-forwarding instruction with users!");
     CI->replaceAllUsesWith(OldArg);
   }

Modified: llvm/trunk/test/Transforms/ObjCARC/rv.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ObjCARC/rv.ll?rev=350261&r1=350260&r2=350261&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ObjCARC/rv.ll (original)
+++ llvm/trunk/test/Transforms/ObjCARC/rv.ll Wed Jan  2 13:00:02 2019
@@ -61,6 +61,11 @@ define void @test2() {
   call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* null)
   call i8* @llvm.objc.autoreleaseReturnValue(i8* null)
   ; call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* null) ; TODO
+  %bitcast = bitcast i32* null to i8*
+  %rb = call i8* @llvm.objc.retainBlock(i8* %bitcast)
+  call void @use_pointer(i8* %rb)
+  %rb2 = call i8* @llvm.objc.retainBlock(i8* undef)
+  call void @use_pointer(i8* %rb2)
   ret void
 }
 




More information about the llvm-commits mailing list