|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: opt %s -S --passes="loop-mssa(simple-loop-unswitch<nontrivial>)" -o - \ |
| 3 | +; RUN: | FileCheck %s |
| 4 | + |
| 5 | +;; The important thing here is that the instructions duplicated from |
| 6 | +;; LOOP_HEADER into ENTRY, and those duplicated from LOOP_LATCH into |
| 7 | +;; LOOP_LATCH_US, get remapped atom numbers. |
| 8 | + |
| 9 | +define i32 @partial_unswitch_true_successor_hoist_invariant(ptr %ptr, i32 %N) !dbg !5 { |
| 10 | +; CHECK-LABEL: define i32 @partial_unswitch_true_successor_hoist_invariant( |
| 11 | +; CHECK-SAME: ptr [[PTR:%.*]], i32 [[N:%.*]]) !dbg [[DBG5:![0-9]+]] { |
| 12 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 13 | +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[PTR]], i64 1, !dbg [[DBG8:![0-9]+]] |
| 14 | +; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG9:![0-9]+]] |
| 15 | +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 100, !dbg [[DBG10:![0-9]+]] |
| 16 | +; CHECK-NEXT: br i1 [[TMP2]], label %[[ENTRY_SPLIT_US:.*]], label %[[ENTRY_SPLIT:.*]] |
| 17 | +; CHECK: [[ENTRY_SPLIT_US]]: |
| 18 | +; CHECK-NEXT: br label %[[LOOP_HEADER_US:.*]], !dbg [[DBG11:![0-9]+]] |
| 19 | +; CHECK: [[LOOP_HEADER_US]]: |
| 20 | +; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], %[[LOOP_LATCH_US:.*]] ], !dbg [[DBG12:![0-9]+]] |
| 21 | +; CHECK-NEXT: br label %[[NOCLOBBER_US:.*]], !dbg [[DBG13:![0-9]+]] |
| 22 | +; CHECK: [[NOCLOBBER_US]]: |
| 23 | +; CHECK-NEXT: br label %[[LOOP_LATCH_US]], !dbg [[DBG14:![0-9]+]] |
| 24 | +; CHECK: [[LOOP_LATCH_US]]: |
| 25 | +; CHECK-NEXT: [[C_US:%.*]] = icmp ult i32 [[IV_US]], [[N]], !dbg [[DBG15:![0-9]+]] |
| 26 | +; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1, !dbg [[DBG16:![0-9]+]] |
| 27 | +; CHECK-NEXT: br i1 [[C_US]], label %[[LOOP_HEADER_US]], label %[[EXIT_SPLIT_US:.*]], !dbg [[DBG17:![0-9]+]] |
| 28 | +; CHECK: [[EXIT_SPLIT_US]]: |
| 29 | +; CHECK-NEXT: br label %[[EXIT:.*]], !dbg [[DBG18:![0-9]+]] |
| 30 | +; CHECK: [[ENTRY_SPLIT]]: |
| 31 | +; CHECK-NEXT: br label %[[LOOP_HEADER:.*]], !dbg [[DBG19:![0-9]+]] |
| 32 | +; CHECK: [[LOOP_HEADER]]: |
| 33 | +; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], !dbg [[DBG20:![0-9]+]] |
| 34 | +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[PTR]], i64 1, !dbg [[DBG21:![0-9]+]] |
| 35 | +; CHECK-NEXT: [[LV:%.*]] = load i32, ptr [[GEP]], align 4, !dbg [[DBG22:![0-9]+]] |
| 36 | +; CHECK-NEXT: [[SC:%.*]] = icmp eq i32 [[LV]], 100, !dbg [[DBG23:![0-9]+]] |
| 37 | +; CHECK-NEXT: br i1 [[SC]], label %[[NOCLOBBER:.*]], label %[[CLOBBER:.*]], !dbg [[DBG24:![0-9]+]] |
| 38 | +; CHECK: [[NOCLOBBER]]: |
| 39 | +; CHECK-NEXT: br label %[[LOOP_LATCH]], !dbg [[DBG25:![0-9]+]] |
| 40 | +; CHECK: [[CLOBBER]]: |
| 41 | +; CHECK-NEXT: call void @clobber(), !dbg [[DBG26:![0-9]+]] |
| 42 | +; CHECK-NEXT: br label %[[LOOP_LATCH]], !dbg [[DBG27:![0-9]+]] |
| 43 | +; CHECK: [[LOOP_LATCH]]: |
| 44 | +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]], !dbg [[DBG28:![0-9]+]] |
| 45 | +; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1, !dbg [[DBG29:![0-9]+]] |
| 46 | +; CHECK-NEXT: br i1 [[C]], label %[[LOOP_HEADER]], label %[[EXIT_SPLIT:.*]], !dbg [[DBG30:![0-9]+]], !llvm.loop [[LOOP31:![0-9]+]] |
| 47 | +; CHECK: [[EXIT_SPLIT]]: |
| 48 | +; CHECK-NEXT: br label %[[EXIT]], !dbg [[DBG33:![0-9]+]] |
| 49 | +; CHECK: [[EXIT]]: |
| 50 | +; CHECK-NEXT: ret i32 10, !dbg [[DBG33]] |
| 51 | +; |
| 52 | +entry: |
| 53 | + br label %loop.header, !dbg !8 |
| 54 | + |
| 55 | +loop.header: ; preds = %loop.latch, %entry |
| 56 | + %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ], !dbg !9 |
| 57 | + %gep = getelementptr i32, ptr %ptr, i64 1, !dbg !10 |
| 58 | + %lv = load i32, ptr %gep, align 4, !dbg !11 |
| 59 | + %sc = icmp eq i32 %lv, 100, !dbg !12 |
| 60 | + br i1 %sc, label %noclobber, label %clobber, !dbg !13 |
| 61 | + |
| 62 | +noclobber: ; preds = %loop.header |
| 63 | + br label %loop.latch, !dbg !14 |
| 64 | + |
| 65 | +clobber: ; preds = %loop.header |
| 66 | + call void @clobber(), !dbg !15 |
| 67 | + br label %loop.latch, !dbg !16 |
| 68 | + |
| 69 | +loop.latch: ; preds = %clobber, %noclobber |
| 70 | + %c = icmp ult i32 %iv, %N, !dbg !17 |
| 71 | + %iv.next = add i32 %iv, 1, !dbg !18 |
| 72 | + br i1 %c, label %loop.header, label %exit, !dbg !19 |
| 73 | + |
| 74 | +exit: ; preds = %loop.latch |
| 75 | + ret i32 10, !dbg !20 |
| 76 | +} |
| 77 | + |
| 78 | +declare void @clobber() |
| 79 | + |
| 80 | +!llvm.dbg.cu = !{!0} |
| 81 | +!llvm.debugify = !{!2, !3} |
| 82 | +!llvm.module.flags = !{!4} |
| 83 | + |
| 84 | +!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug) |
| 85 | +!1 = !DIFile(filename: "test.ll", directory: "/") |
| 86 | +!2 = !{i32 13} |
| 87 | +!3 = !{i32 0} |
| 88 | +!4 = !{i32 2, !"Debug Info Version", i32 3} |
| 89 | +!5 = distinct !DISubprogram(name: "partial_unswitch_true_successor_hoist_invariant", linkageName: "partial_unswitch_true_successor_hoist_invariant", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0) |
| 90 | +!6 = !DISubroutineType(types: !7) |
| 91 | +!7 = !{} |
| 92 | +!8 = !DILocation(line: 1, column: 1, scope: !5, atomGroup: 1, atomRank: 1) |
| 93 | +!9 = !DILocation(line: 2, column: 1, scope: !5, atomGroup: 2, atomRank: 1) |
| 94 | +!10 = !DILocation(line: 3, column: 1, scope: !5, atomGroup: 3, atomRank: 1) |
| 95 | +!11 = !DILocation(line: 4, column: 1, scope: !5, atomGroup: 4, atomRank: 1) |
| 96 | +!12 = !DILocation(line: 5, column: 1, scope: !5, atomGroup: 5, atomRank: 1) |
| 97 | +!13 = !DILocation(line: 6, column: 1, scope: !5, atomGroup: 6, atomRank: 1) |
| 98 | +!14 = !DILocation(line: 7, column: 1, scope: !5, atomGroup: 7, atomRank: 1) |
| 99 | +!15 = !DILocation(line: 8, column: 1, scope: !5, atomGroup: 8, atomRank: 1) |
| 100 | +!16 = !DILocation(line: 9, column: 1, scope: !5, atomGroup: 9, atomRank: 1) |
| 101 | +!17 = !DILocation(line: 10, column: 1, scope: !5, atomGroup: 10, atomRank: 1) |
| 102 | +!18 = !DILocation(line: 11, column: 1, scope: !5, atomGroup: 11, atomRank: 1) |
| 103 | +!19 = !DILocation(line: 12, column: 1, scope: !5, atomGroup: 12, atomRank: 1) |
| 104 | +!20 = !DILocation(line: 13, column: 1, scope: !5, atomGroup: 13, atomRank: 1) |
| 105 | +;. |
| 106 | +; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C, file: [[META1:![0-9]+]], producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug) |
| 107 | +; CHECK: [[META1]] = !DIFile(filename: "test.ll", directory: {{.*}}) |
| 108 | +; CHECK: [[DBG5]] = distinct !DISubprogram(name: "partial_unswitch_true_successor_hoist_invariant", linkageName: "partial_unswitch_true_successor_hoist_invariant", scope: null, file: [[META1]], line: 1, type: [[META6:![0-9]+]], scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]]) |
| 109 | +; CHECK: [[META6]] = !DISubroutineType(types: [[META7:![0-9]+]]) |
| 110 | +; CHECK: [[META7]] = !{} |
| 111 | +; CHECK: [[DBG8]] = !DILocation(line: 3, column: 1, scope: [[DBG5]], atomGroup: 25, atomRank: 1) |
| 112 | +; CHECK: [[DBG9]] = !DILocation(line: 4, column: 1, scope: [[DBG5]], atomGroup: 26, atomRank: 1) |
| 113 | +; CHECK: [[DBG10]] = !DILocation(line: 5, column: 1, scope: [[DBG5]], atomGroup: 27, atomRank: 1) |
| 114 | +; CHECK: [[DBG11]] = !DILocation(line: 1, column: 1, scope: [[DBG5]], atomGroup: 14, atomRank: 1) |
| 115 | +; CHECK: [[DBG12]] = !DILocation(line: 2, column: 1, scope: [[DBG5]], atomGroup: 15, atomRank: 1) |
| 116 | +; CHECK: [[DBG13]] = !DILocation(line: 6, column: 1, scope: [[DBG5]], atomGroup: 19, atomRank: 1) |
| 117 | +; CHECK: [[DBG14]] = !DILocation(line: 7, column: 1, scope: [[DBG5]], atomGroup: 20, atomRank: 1) |
| 118 | +; CHECK: [[DBG15]] = !DILocation(line: 10, column: 1, scope: [[DBG5]], atomGroup: 21, atomRank: 1) |
| 119 | +; CHECK: [[DBG16]] = !DILocation(line: 11, column: 1, scope: [[DBG5]], atomGroup: 22, atomRank: 1) |
| 120 | +; CHECK: [[DBG17]] = !DILocation(line: 12, column: 1, scope: [[DBG5]], atomGroup: 23, atomRank: 1) |
| 121 | +; CHECK: [[DBG18]] = !DILocation(line: 13, column: 1, scope: [[DBG5]], atomGroup: 24, atomRank: 1) |
| 122 | +; CHECK: [[DBG19]] = !DILocation(line: 1, column: 1, scope: [[DBG5]], atomGroup: 1, atomRank: 1) |
| 123 | +; CHECK: [[DBG20]] = !DILocation(line: 2, column: 1, scope: [[DBG5]], atomGroup: 2, atomRank: 1) |
| 124 | +; CHECK: [[DBG21]] = !DILocation(line: 3, column: 1, scope: [[DBG5]], atomGroup: 3, atomRank: 1) |
| 125 | +; CHECK: [[DBG22]] = !DILocation(line: 4, column: 1, scope: [[DBG5]], atomGroup: 4, atomRank: 1) |
| 126 | +; CHECK: [[DBG23]] = !DILocation(line: 5, column: 1, scope: [[DBG5]], atomGroup: 5, atomRank: 1) |
| 127 | +; CHECK: [[DBG24]] = !DILocation(line: 6, column: 1, scope: [[DBG5]], atomGroup: 6, atomRank: 1) |
| 128 | +; CHECK: [[DBG25]] = !DILocation(line: 7, column: 1, scope: [[DBG5]], atomGroup: 7, atomRank: 1) |
| 129 | +; CHECK: [[DBG26]] = !DILocation(line: 8, column: 1, scope: [[DBG5]], atomGroup: 8, atomRank: 1) |
| 130 | +; CHECK: [[DBG27]] = !DILocation(line: 9, column: 1, scope: [[DBG5]], atomGroup: 9, atomRank: 1) |
| 131 | +; CHECK: [[DBG28]] = !DILocation(line: 10, column: 1, scope: [[DBG5]], atomGroup: 10, atomRank: 1) |
| 132 | +; CHECK: [[DBG29]] = !DILocation(line: 11, column: 1, scope: [[DBG5]], atomGroup: 11, atomRank: 1) |
| 133 | +; CHECK: [[DBG30]] = !DILocation(line: 12, column: 1, scope: [[DBG5]], atomGroup: 12, atomRank: 1) |
| 134 | +; CHECK: [[LOOP31]] = distinct !{[[LOOP31]], [[META32:![0-9]+]]} |
| 135 | +; CHECK: [[META32]] = !{!"llvm.loop.unswitch.partial.disable"} |
| 136 | +; CHECK: [[DBG33]] = !DILocation(line: 13, column: 1, scope: [[DBG5]], atomGroup: 13, atomRank: 1) |
| 137 | +;. |
0 commit comments