159fab226SJeremy Morse; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 259fab226SJeremy Morse; RUN: opt -passes='loop-mssa(simple-loop-unswitch<nontrivial>),verify<loops>' -S < %s | FileCheck %s 359fab226SJeremy Morse; RUN: opt -passes='loop-mssa(simple-loop-unswitch<nontrivial>),verify<loops>' -S < %s --try-experimental-debuginfo-iterators | FileCheck %s 459fab226SJeremy Morse; 559fab226SJeremy Morse;; Check that when we duplicate the load in the loop header, we also duplicate 659fab226SJeremy Morse;; the corresponding dbg.value. 759fab226SJeremy Morse;; FIXME: the hoisted load dominates the duplicated dbg.value, however as it's 859fab226SJeremy Morse;; not subsequently used in the loop, so it doesn't get remapped into the 959fab226SJeremy Morse;; debug user and we get a undef/poison dbg.value. This is suboptimal, but it's 1059fab226SJeremy Morse;; important that the dbg.value gets duplicated nonetheless. 1159fab226SJeremy Morse 1259fab226SJeremy Morsedeclare void @clobber() 1359fab226SJeremy Morsedeclare void @llvm.dbg.value(metadata, metadata, metadata) 1459fab226SJeremy Morse 1559fab226SJeremy Morsedefine i32 @partial_unswitch_true_successor(ptr %ptr, i32 %N) { 1659fab226SJeremy Morse; CHECK-LABEL: @partial_unswitch_true_successor( 1759fab226SJeremy Morse; CHECK-NEXT: entry: 1859fab226SJeremy Morse; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR:%.*]], align 4 1959fab226SJeremy Morse; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 100 2059fab226SJeremy Morse; CHECK-NEXT: br i1 [[TMP1]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] 2159fab226SJeremy Morse; CHECK: entry.split.us: 2259fab226SJeremy Morse; CHECK-NEXT: br label [[LOOP_HEADER_US:%.*]] 2359fab226SJeremy Morse; CHECK: loop.header.us: 2459fab226SJeremy Morse; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], [[LOOP_LATCH_US:%.*]] ] 25*09457270SStephen Tozer; CHECK-NEXT: #dbg_value(i32 poison, [[META3:![0-9]+]], !DIExpression(), [[META8:![0-9]+]]) 2659fab226SJeremy Morse; CHECK-NEXT: br label [[NOCLOBBER_US:%.*]] 2759fab226SJeremy Morse; CHECK: noclobber.us: 2859fab226SJeremy Morse; CHECK-NEXT: br label [[LOOP_LATCH_US]] 2959fab226SJeremy Morse; CHECK: loop.latch.us: 3059fab226SJeremy Morse; CHECK-NEXT: [[C_US:%.*]] = icmp ult i32 [[IV_US]], [[N:%.*]] 3159fab226SJeremy Morse; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1 3259fab226SJeremy Morse; CHECK-NEXT: br i1 [[C_US]], label [[LOOP_HEADER_US]], label [[EXIT_SPLIT_US:%.*]] 3359fab226SJeremy Morse; CHECK: exit.split.us: 3459fab226SJeremy Morse; CHECK-NEXT: br label [[EXIT:%.*]] 3559fab226SJeremy Morse; CHECK: entry.split: 3659fab226SJeremy Morse; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 3759fab226SJeremy Morse; CHECK: loop.header: 3859fab226SJeremy Morse; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 3959fab226SJeremy Morse; CHECK-NEXT: [[LV:%.*]] = load i32, ptr [[PTR]], align 4 40*09457270SStephen Tozer; CHECK-NEXT: #dbg_value(i32 [[LV]], [[META3]], !DIExpression(), [[META8]]) 4159fab226SJeremy Morse; CHECK-NEXT: [[SC:%.*]] = icmp eq i32 [[LV]], 100 4259fab226SJeremy Morse; CHECK-NEXT: br i1 [[SC]], label [[NOCLOBBER:%.*]], label [[CLOBBER:%.*]] 4359fab226SJeremy Morse; CHECK: noclobber: 4459fab226SJeremy Morse; CHECK-NEXT: br label [[LOOP_LATCH]] 4559fab226SJeremy Morse; CHECK: clobber: 4659fab226SJeremy Morse; CHECK-NEXT: call void @clobber() 4759fab226SJeremy Morse; CHECK-NEXT: br label [[LOOP_LATCH]] 4859fab226SJeremy Morse; CHECK: loop.latch: 4959fab226SJeremy Morse; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]] 5059fab226SJeremy Morse; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 5159fab226SJeremy Morse; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP9:![0-9]+]] 5259fab226SJeremy Morse; CHECK: exit.split: 5359fab226SJeremy Morse; CHECK-NEXT: br label [[EXIT]] 5459fab226SJeremy Morse; CHECK: exit: 5559fab226SJeremy Morse; CHECK-NEXT: ret i32 10 5659fab226SJeremy Morse; 5759fab226SJeremy Morseentry: 5859fab226SJeremy Morse br label %loop.header 5959fab226SJeremy Morse 6059fab226SJeremy Morseloop.header: 6159fab226SJeremy Morse %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 6259fab226SJeremy Morse %lv = load i32, ptr %ptr 6359fab226SJeremy Morse call void @llvm.dbg.value(metadata i32 %lv, metadata !6, metadata !DIExpression()), !dbg !7 6459fab226SJeremy Morse %sc = icmp eq i32 %lv, 100 6559fab226SJeremy Morse br i1 %sc, label %noclobber, label %clobber 6659fab226SJeremy Morse 6759fab226SJeremy Morsenoclobber: 6859fab226SJeremy Morse br label %loop.latch 6959fab226SJeremy Morse 7059fab226SJeremy Morseclobber: 7159fab226SJeremy Morse call void @clobber() 7259fab226SJeremy Morse br label %loop.latch 7359fab226SJeremy Morse 7459fab226SJeremy Morseloop.latch: 7559fab226SJeremy Morse %c = icmp ult i32 %iv, %N 7659fab226SJeremy Morse %iv.next = add i32 %iv, 1 7759fab226SJeremy Morse br i1 %c, label %loop.header, label %exit 7859fab226SJeremy Morse 7959fab226SJeremy Morseexit: 8059fab226SJeremy Morse ret i32 10 8159fab226SJeremy Morse} 8259fab226SJeremy Morse 8359fab226SJeremy Morse!llvm.module.flags = !{!21} 8459fab226SJeremy Morse!llvm.dbg.cu = !{!2} 8559fab226SJeremy Morse 8659fab226SJeremy Morse!0 = distinct !DISubprogram(name: "foo", line: 2, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !2, file: !20, scope: !1, type: !3) 8759fab226SJeremy Morse!1 = !DIFile(filename: "b.c", directory: "/private/tmp") 8859fab226SJeremy Morse!2 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang", isOptimized: true, emissionKind: FullDebug, file: !20) 8959fab226SJeremy Morse!3 = !DISubroutineType(types: !4) 9059fab226SJeremy Morse!4 = !{!5} 9159fab226SJeremy Morse!5 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 9259fab226SJeremy Morse!6 = !DILocalVariable(name: "i", line: 2, arg: 1, scope: !0, file: !1, type: !5) 9359fab226SJeremy Morse!7 = !DILocation(line: 2, column: 13, scope: !0) 9459fab226SJeremy Morse!9 = !DILocalVariable(name: "k", line: 3, scope: !10, file: !1, type: !5) 9559fab226SJeremy Morse!10 = distinct !DILexicalBlock(line: 2, column: 16, file: !20, scope: !0) 9659fab226SJeremy Morse!11 = !DILocation(line: 3, column: 12, scope: !10) 9759fab226SJeremy Morse!12 = !DILocation(line: 4, column: 3, scope: !10) 9859fab226SJeremy Morse!13 = !DILocation(line: 5, column: 5, scope: !14) 9959fab226SJeremy Morse!14 = distinct !DILexicalBlock(line: 4, column: 10, file: !20, scope: !10) 10059fab226SJeremy Morse!15 = !DILocation(line: 6, column: 3, scope: !14) 10159fab226SJeremy Morse!16 = !DILocation(line: 7, column: 5, scope: !17) 10259fab226SJeremy Morse!17 = distinct !DILexicalBlock(line: 6, column: 10, file: !20, scope: !10) 10359fab226SJeremy Morse!18 = !DILocation(line: 8, column: 3, scope: !17) 10459fab226SJeremy Morse!19 = !DILocation(line: 9, column: 3, scope: !10) 10559fab226SJeremy Morse!20 = !DIFile(filename: "b.c", directory: "/private/tmp") 10659fab226SJeremy Morse!21 = !{i32 1, !"Debug Info Version", i32 3} 10759fab226SJeremy Morse 10859fab226SJeremy Morse 109