| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -S -passes="loop-mssa(loop-simplifycfg,simple-loop-unswitch)" < %s | FileCheck %s |
| |
| ; Check that IR is valid when MemorySSA is updated during MergeBlockIntoPredecessor. |
| |
| define i32 @f1(i1 %cond) personality ptr null { |
| ; CHECK-LABEL: define i32 @f1( |
| ; CHECK-SAME: i1 [[COND:%.*]]) personality ptr null { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: br i1 [[COND]], label %[[ENTRY_SPLIT:.*]], label %[[COMMON_RET_LOOPEXIT:.*]] |
| ; CHECK: [[ENTRY_SPLIT]]: |
| ; CHECK-NEXT: br label %[[FOR_COND:.*]] |
| ; CHECK: [[FOR_COND]]: |
| ; CHECK-NEXT: [[CALL26:%.*]] = invoke i32 @f2(ptr null, ptr null, ptr null) |
| ; CHECK-NEXT: to label %[[FOR_COND]] unwind label %[[LPAD24:.*]] |
| ; CHECK: [[COMMON_RET_LOOPEXIT]]: |
| ; CHECK-NEXT: br label %[[COMMON_RET:.*]] |
| ; CHECK: [[COMMON_RET]]: |
| ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 0, %[[LPAD24]] ], [ 0, %[[COMMON_RET_LOOPEXIT]] ] |
| ; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] |
| ; CHECK: [[LPAD24]]: |
| ; CHECK-NEXT: [[LPAD:%.*]] = landingpad { ptr, i32 } |
| ; CHECK-NEXT: cleanup |
| ; CHECK-NEXT: br label %[[COMMON_RET]] |
| ; |
| entry: |
| br label %for.cond |
| |
| for.cond: ; preds = %if.end19, %entry |
| br i1 %cond, label %if.end19, label %common.ret |
| |
| common.ret: ; preds = %lpad24, %for.cond |
| %common.ret.op = phi i32 [ 0, %lpad24 ], [ 0, %for.cond ] |
| ret i32 %common.ret.op |
| |
| if.end19: ; preds = %for.cond |
| %call26 = invoke i32 @f2(ptr null, ptr null, ptr null) |
| to label %for.cond unwind label %lpad24 |
| |
| lpad24: ; preds = %if.end19 |
| %lpad = landingpad { ptr, i32 } |
| cleanup |
| br label %common.ret |
| } |
| |
| declare i32 @f2(ptr, ptr, ptr) |