blob: 3c46e67bb562489ae33fe1a11551467dbd9e1564 [file] [log] [blame] [edit]
; 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
}