|
1 |
| -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
2 | 1 | ; RUN: opt %s -S --passes="loop-mssa(simple-loop-unswitch<nontrivial>)" -o - \
|
3 | 2 | ; RUN: | FileCheck %s
|
4 | 3 |
|
|
27 | 26 |
|
28 | 27 | ; CHECK-LABEL: define i32 @partial_unswitch_true_successor_hoist_invariant(
|
29 | 28 | ; CHECK-SAME: ptr [[PTR:%.*]], i32 [[N:%.*]]) !dbg [[DBG5:![0-9]+]] {
|
| 29 | + |
| 30 | +;; Instructions duplicated from loop.header need remapped atoms. |
30 | 31 | ; CHECK-NEXT: [[ENTRY:.*:]]
|
31 | 32 | ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[PTR]], i64 1, !dbg [[DBG8:![0-9]+]]
|
32 | 33 | ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG9:![0-9]+]]
|
33 | 34 | ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 100, !dbg [[DBG10:![0-9]+]]
|
34 | 35 | ; CHECK-NEXT: br i1 [[TMP2]], label %[[ENTRY_SPLIT_US:.*]], label %[[ENTRY_SPLIT:.*]]
|
| 36 | + |
| 37 | +;; Same source location as entry's original br, with remapped atom group. |
35 | 38 | ; CHECK: [[ENTRY_SPLIT_US]]:
|
36 | 39 | ; CHECK-NEXT: br label %[[LOOP_HEADER_US:.*]], !dbg [[DBG11:![0-9]+]]
|
| 40 | + |
| 41 | +;; Instructions duplicated from loop.header need remapped atoms. |
37 | 42 | ; CHECK: [[LOOP_HEADER_US]]:
|
38 | 43 | ; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], %[[LOOP_LATCH_US:.*]] ], !dbg [[DBG12:![0-9]+]]
|
39 | 44 | ; CHECK-NEXT: br label %[[NOCLOBBER_US:.*]], !dbg [[DBG13:![0-9]+]]
|
| 45 | + |
| 46 | +;; Instructions duplicated from noclobber need remapped atoms. |
40 | 47 | ; CHECK: [[NOCLOBBER_US]]:
|
41 | 48 | ; CHECK-NEXT: br label %[[LOOP_LATCH_US]], !dbg [[DBG14:![0-9]+]]
|
| 49 | + |
42 | 50 | ; CHECK: [[LOOP_LATCH_US]]:
|
43 | 51 | ; CHECK-NEXT: [[C_US:%.*]] = icmp ult i32 [[IV_US]], [[N]], !dbg [[DBG15:![0-9]+]]
|
44 | 52 | ; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1, !dbg [[DBG16:![0-9]+]]
|
45 | 53 | ; CHECK-NEXT: br i1 [[C_US]], label %[[LOOP_HEADER_US]], label %[[EXIT_SPLIT_US:.*]], !dbg [[DBG17:![0-9]+]]
|
| 54 | + |
| 55 | +;; Split from exit, this DILocation shouldn't have source atom info. |
46 | 56 | ; CHECK: [[EXIT_SPLIT_US]]:
|
47 | 57 | ; CHECK-NEXT: br label %[[EXIT:.*]], !dbg [[DBG18:![0-9]+]]
|
| 58 | + |
| 59 | +;; Same source location as entry's original br, with remapped atom group. |
48 | 60 | ; CHECK: [[ENTRY_SPLIT]]:
|
49 | 61 | ; CHECK-NEXT: br label %[[LOOP_HEADER:.*]], !dbg [[DBG19:![0-9]+]]
|
| 62 | + |
| 63 | +;; Original loop blocks - the atoms groups should be distinct from those |
| 64 | +;; on duplicated instructions in the blocks above. |
50 | 65 | ; CHECK: [[LOOP_HEADER]]:
|
51 | 66 | ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], !dbg [[DBG20:![0-9]+]]
|
52 | 67 | ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[PTR]], i64 1, !dbg [[DBG21:![0-9]+]]
|
|
61 | 76 | ; CHECK: [[LOOP_LATCH]]:
|
62 | 77 | ; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]], !dbg [[DBG28:![0-9]+]]
|
63 | 78 | ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1, !dbg [[DBG29:![0-9]+]]
|
64 |
| -; CHECK-NEXT: br i1 [[C]], label %[[LOOP_HEADER]], label %[[EXIT_SPLIT:.*]], !dbg [[DBG30:![0-9]+]], !llvm.loop [[LOOP31:![0-9]+]] |
| 79 | +; CHECK-NEXT: br i1 [[C]], label %[[LOOP_HEADER]], label %[[EXIT_SPLIT:.*]], !dbg [[DBG30:![0-9]+]] |
| 80 | + |
| 81 | +;; Split from exit, this DILocation shouldn't have source atom info. |
65 | 82 | ; CHECK: [[EXIT_SPLIT]]:
|
66 | 83 | ; CHECK-NEXT: br label %[[EXIT]], !dbg [[DBG18]]
|
| 84 | + |
| 85 | +;; exit.split and exit.split.us take the source location from here but drop its |
| 86 | +;; source atom info. |
67 | 87 | ; CHECK: [[EXIT]]:
|
68 | 88 | ; CHECK-NEXT: ret i32 10, !dbg [[DBG33:![0-9]+]]
|
69 | 89 |
|
|
0 commit comments