[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Analysis / MemorySSA / simple_loop_unswitch_nontrivial.ll
blob7d1022519f458672ec0554e3eb6e925d79b328f8
1 ; RUN: opt -simple-loop-unswitch -enable-nontrivial-unswitch -verify-memoryssa -S %s | FileCheck %s
2 ; REQUIRES: asserts
4 target triple = "x86_64-unknown-linux-gnu"
6 declare void @foo()
8 ; In Test1, there are no definitions. MemorySSA updates insert trivial phis and remove them.
9 ; Verify all are removed, considering the SLU pass leaves unreachable blocks hanging when the MSSA updates are done.
10 ; CHECK-LABEL: @Test1
11 define void @Test1(i32) {
12 header:
13   br label %outer
15 outer.loopexit.split:                             ; preds = %continue
16   br label %outer.loopexit
18 outer.loopexit:                                   ; preds = %outer.loopexit.split.us, %outer.loopexit.split
19   br label %outer
21 outer:                                            ; preds = %outer.loopexit, %header
22   br i1 false, label %outer.split.us, label %outer.split
24 outer.split.us:                                   ; preds = %outer
25   br label %inner.us
27 inner.us:                                         ; preds = %continue.us, %outer.split.us
28   br label %overflow.us
30 overflow.us:                                      ; preds = %inner.us
31   br label %continue.us
33 continue.us:                                      ; preds = %overflow.us
34   br i1 true, label %outer.loopexit.split.us, label %inner.us
36 outer.loopexit.split.us:                          ; preds = %continue.us
37   br label %outer.loopexit
39 outer.split:                                      ; preds = %outer
40   br label %inner
42 inner:                                            ; preds = %continue, %outer.split
43   br label %switchme
45 switchme:                                         ; preds = %inner
46   switch i32 %0, label %continue [
47     i32 88, label %go_out
48     i32 99, label %case2
49   ]
51 case2:                                            ; preds = %switchme
52   br label %continue
54 continue:                                         ; preds = %case2, %switchme
55   br i1 true, label %outer.loopexit.split, label %inner
57 go_out:                                           ; preds = %switchme
58   unreachable
61 ; In Test2 there is a single def (call to foo). There are already Phis in place that are cloned when unswitching.
62 ; Ensure MemorySSA remains correct. Due to SLU's pruned cloning, continue.us2 becomes unreachable, with an empty Phi that is later cleaned.
63 ; CHECK-LABEL: @Test2
64 define void @Test2(i32) {
65 header:
66   br label %outer
68 outer.loopexit.split:                             ; preds = %continue
69   br label %outer.loopexit
71 outer.loopexit:                                   ; preds = %outer.loopexit.split.us, %outer.loopexit.split
72   br label %outer
74 outer:                                            ; preds = %outer.loopexit, %header
75   br i1 false, label %outer.split.us, label %outer.split
77 outer.split.us:                                   ; preds = %outer
78   br label %inner.us
80 inner.us:                                         ; preds = %continue.us, %outer.split.us
81   br label %overflow.us
83 overflow.us:                                      ; preds = %inner.us
84   br label %continue.us
86 continue.us:                                      ; preds = %overflow.us
87   br i1 true, label %outer.loopexit.split.us, label %inner.us
89 outer.loopexit.split.us:                          ; preds = %continue.us
90   br label %outer.loopexit
92 outer.split:                                      ; preds = %outer
93   br label %inner
95 inner:                                            ; preds = %continue, %outer.split
96   br label %switchme
98 switchme:                                         ; preds = %inner
99   switch i32 %0, label %continue [
100     i32 88, label %go_out
101     i32 99, label %case2
102   ]
104 case2:                                            ; preds = %switchme
105   call void @foo()
106   br label %continue
108 continue:                                         ; preds = %case2, %switchme
109   br i1 true, label %outer.loopexit.split, label %inner
111 go_out:                                           ; preds = %switchme
112   unreachable