; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt -S -passes=licm -verify-memoryssa < %s | FileCheck %s define void @test(ptr %p) { ; CHECK-LABEL: define void @test( ; CHECK-SAME: ptr [[P:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: br label %[[LOOP0:.*]] ; CHECK: [[LOOP0]]: ; CHECK-NEXT: br label %[[LOOP1:.*]] ; CHECK: [[LOOP1]]: ; CHECK-NEXT: [[DEC10:%.*]] = phi i64 [ 0, %[[LOOP0]] ], [ 1, %[[LOOP1]] ] ; CHECK-NEXT: br i1 false, label %[[LOOP1_EXIT:.*]], label %[[LOOP1]] ; CHECK: [[LOOP1_EXIT]]: ; CHECK-NEXT: [[DEC10_LCSSA:%.*]] = phi i64 [ [[DEC10]], %[[LOOP1]] ] ; CHECK-NEXT: switch i32 0, label %[[LOOP0_LATCH:.*]] [ ; CHECK-NEXT: i32 0, label %[[LOOP0_LATCH]] ; CHECK-NEXT: i32 2, label %[[LOOP3_PREHEADER:.*]] ; CHECK-NEXT: i32 1, label %[[LOOP2:.*]] ; CHECK-NEXT: ] ; CHECK: [[LOOP2]]: ; CHECK-NEXT: br i1 false, label %[[LOOP0_LATCH]], label %[[LOOP3_PREHEADER]] ; CHECK: [[LOOP3_PREHEADER]]: ; CHECK-NEXT: br label %[[LOOP3:.*]] ; CHECK: [[LOOP3]]: ; CHECK-NEXT: switch i32 0, label %[[EXIT:.*]] [ ; CHECK-NEXT: i32 0, label %[[LOOP3]] ; CHECK-NEXT: i32 1, label %[[LOOP2_LATCH:.*]] ; CHECK-NEXT: ] ; CHECK: [[LOOP2_LATCH]]: ; CHECK-NEXT: br label %[[LOOP2]] ; CHECK: [[LOOP0_LATCH]]: ; CHECK-NEXT: br label %[[LOOP0]] ; CHECK: [[EXIT]]: ; CHECK-NEXT: [[DEC10_LCSSA_LCSSA:%.*]] = phi i64 [ [[DEC10_LCSSA]], %[[LOOP3]] ] ; CHECK-NEXT: store i64 [[DEC10_LCSSA_LCSSA]], ptr [[P]], align 4 ; CHECK-NEXT: store i64 1, ptr [[P]], align 4 ; CHECK-NEXT: ret void ; entry: br label %loop0 loop0: ; preds = %loop0.latch, %entry br label %loop1 loop1: ; preds = %loop1, %loop0 %dec10 = phi i64 [ 0, %loop0 ], [ 1, %loop1 ] store i64 %dec10, ptr %p br i1 false, label %loop1.exit, label %loop1 loop1.exit: ; preds = %loop1 switch i32 0, label %loop0.latch [ i32 0, label %loop0.latch i32 2, label %loop3.preheader i32 1, label %loop2 ] loop2: ; preds = %loop2.latch, %loop1.exit br i1 false, label %loop0.latch, label %loop3.preheader loop3.preheader: ; preds = %loop1.exit, %loop2 br label %loop3 loop3: ; preds = %loop3.preheader, %loop3 switch i32 0, label %exit [ i32 0, label %loop3 i32 1, label %loop2.latch ] loop2.latch: ; preds = %loop3 br label %loop2 loop0.latch: ; preds = %loop2, %loop1.exit, %loop1.exit store i64 0, ptr %p br label %loop0 exit: ; preds = %loop3 store i64 1, ptr %p ret void }