| ; RUN: opt -passes=lower-constant-intrinsics -S < %s | FileCheck %s |
| |
| ; This is a reproducer for a heap-use-after-free bug that occurred due to trying |
| ; to process a PHI node that was removed in a preceding worklist iteration. The |
| ; conditional branch in %cont2.i will be replaced with an unconditional branch |
| ; to %cont4.i. As a result of that, the PHI node in %handler.type_mismatch3.i |
| ; will be left with one predecessor and will thus be removed in that iteration. |
| |
| ; CHECK-NOT: phi |
| ; CHECK: cont2.i: |
| ; CHECK-NEXT: br label %cont4.i |
| ; CHECK-NOT: phi |
| |
| %s = type { [2 x i16] } |
| |
| define fastcc void @foo(ptr %p) unnamed_addr { |
| entry: |
| %0 = tail call i32 @llvm.objectsize.i32.p0(ptr %p, i1 false, i1 false, i1 false) #2 |
| %1 = icmp ne i32 %0, 0 |
| %.not1.i = icmp eq i32 %0, 0 |
| br label %for.cond |
| |
| for.cond: ; preds = %entry |
| br label %cont.i |
| |
| cont.i: ; preds = %for.cond |
| br i1 undef, label %cont2.i, label %cont2.thread.i |
| |
| cont2.thread.i: ; preds = %cont.i |
| br label %handler.type_mismatch3.i |
| |
| cont2.i: ; preds = %cont.i |
| br i1 %.not1.i, label %handler.type_mismatch3.i, label %cont4.i |
| |
| handler.type_mismatch3.i: ; preds = %cont2.i, %cont2.thread.i |
| %2 = phi i1 [ %1, %cont2.thread.i ], [ false, %cont2.i ] |
| unreachable |
| |
| cont4.i: ; preds = %cont2.i |
| unreachable |
| } |
| |
| ; Function Attrs: nofree nosync nounwind readnone speculatable willreturn |
| declare i32 @llvm.objectsize.i32.p0(ptr, i1 immarg, i1 immarg, i1 immarg) #1 |
| |
| attributes #1 = { nofree nosync nounwind readnone speculatable willreturn } |
| attributes #2 = { nounwind } |