brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · 4b5f19d Raw
146 lines · plain
1# RUN: llc -mtriple=x86_64-unknown-unknown %s -o - -run-pass=register-coalescer | FileCheck %s2# PR40010: DBG_VALUEs do not contribute to the liveness of virtual registers,3# and the register coalescer would merge new live values on top of DBG_VALUEs,4# leading to them presenting new (wrong) values to the debugger. Test that5# when out of liveness, coalescing will mark DBG_VALUEs in non-live locations6# as undef.7--- |8  ; ModuleID = './test.ll'9  source_filename = "./test.ll"10  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"11 12  ; Function Attrs: nounwind readnone speculatable13  declare void @llvm.dbg.value(metadata, metadata, metadata) #014 15  ; Original IR source here:16  define i32 @test(ptr %pin) {17  entry:18    br label %start.test119 20  start.test1:                                       ; preds = %start, %entry21    %foo = phi i32 [ 0, %entry ], [ %bar, %start.test1 ]22    %baz = load i32, ptr %pin, align 123    %qux = xor i32 %baz, 123424    %bar = add i32 %qux, %foo25    call void @llvm.dbg.value(metadata i32 %foo, metadata !3, metadata !DIExpression()), !dbg !526    %cmp = icmp ugt i32 %bar, 100000027    br i1 %cmp, label %leave, label %start.test128 29  leave:                                            ; preds = %start30    ret i32 %bar31  }32 33  ; Stubs to appease the MIR parser34  define i32 @test2(ptr %pin) {35  entry:36    ret i32 037  start.test2:38    ret i32 039  leave:40    ret i32 041  }42 43  ; Function Attrs: nounwind44  declare void @llvm.stackprotector(ptr, ptr) #145 46  attributes #0 = { nounwind readnone speculatable }47  attributes #1 = { nounwind }48 49  !llvm.module.flags = !{!0}50  !llvm.dbg.cu = !{!1}51 52  !0 = !{i32 2, !"Debug Info Version", i32 3}53  !1 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !2, producer: "beards", isOptimized: true, runtimeVersion: 4, emissionKind: FullDebug)54  !2 = !DIFile(filename: "bees.cpp", directory: "")55  !3 = !DILocalVariable(name: "bees", scope: !4)56  !4 = distinct !DISubprogram(name: "nope", scope: !1, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1)57  !5 = !DILocation(line: 0, scope: !4)58 59...60---61name:            test62tracksRegLiveness: true63body:             |64  bb.0.entry:65    successors: %bb.1(0x80000000)66    liveins: $rdi67 68    %2:gr64 = COPY killed $rdi69    %3:gr32 = MOV32r0 implicit-def dead $eflags70    %4:gr32 = MOV32ri 123471    %7:gr32 = COPY killed %372 73  bb.1.start.test1:74    successors: %bb.2(0x04000000), %bb.1(0x7c000000)75 76    ; CHECK-LABEL: name: test77    ;78    ; We currently expect %1 and %0 to merge into %779    ;80    ; CHECK: %[[REG1:[0-9]+]]:gr32 = MOV32rm81    ; CHECK-NEXT: %[[REG2:[0-9]+]]:gr32 = XOR32rr %[[REG1]]82    ; CHECK-NEXT: %[[REG3:[0-9]+]]:gr32 = ADD32rr %[[REG3]], %[[REG2]]83    ; CHECK-NEXT: DBG_VALUE $noreg84 85    %0:gr32 = COPY killed %786    %8:gr32 = MOV32rm %2, 1, $noreg, 0, $noreg :: (load (s32) from %ir.pin, align 1)87    %5:gr32 = COPY killed %888    %5:gr32 = XOR32rr %5, %4, implicit-def dead $eflags89    %1:gr32 = COPY killed %090    %1:gr32 = ADD32rr %1, killed %5, implicit-def dead $eflags91    DBG_VALUE %0, $noreg, !3, !DIExpression(), debug-location !592    CMP32ri %1, 1000001, implicit-def $eflags93    %7:gr32 = COPY %194    JCC_1 %bb.1, 2, implicit killed $eflags95    JMP_1 %bb.296 97  bb.2.leave:98    $eax = COPY killed %199    RET 0, killed $eax100 101...102---103name:            test2104tracksRegLiveness: true105body:             |106  bb.0.entry:107    successors: %bb.1(0x80000000)108    liveins: $rdi109 110    %2:gr64 = COPY killed $rdi111    %3:gr32 = MOV32r0 implicit-def dead $eflags112    %4:gr32 = MOV32ri 1234113    %7:gr32 = COPY killed %3114 115  bb.1.start.test2:116    successors: %bb.2(0x04000000), %bb.1(0x7c000000)117 118    ; CHECK-LABEL: name: test2119    ;120    ; %0 should be merged into %7, but as %0 is live at this location the121    ; DBG_VALUE should be preserved and point at the operand of ADD32rr.122    ; RegisterCoalescer resolves %0 as CR_Erase: %0 is a redundant copy and123    ; can be erased.124    ;125    ; CHECK: %[[REG11:[0-9]+]]:gr32 = MOV32rm126    ; CHECK-NEXT: %[[REG12:[0-9]+]]:gr32 = XOR32rr %[[REG11]]127    ; CHECK-NEXT: DBG_VALUE %[[REG13:[0-9]+]]128    ; CHECK-NEXT: %[[REG13]]:gr32 = ADD32rr %[[REG13]], %[[REG12]]129 130    %0:gr32 = COPY killed %7131    %8:gr32 = MOV32rm %2, 1, $noreg, 0, $noreg :: (load (s32) from %ir.pin, align 1)132    %8:gr32 = XOR32rr %8, %4, implicit-def dead $eflags133    DBG_VALUE %0, $noreg, !3, !DIExpression(), debug-location !5134    %0:gr32 = ADD32rr %0, killed %8, implicit-def dead $eflags135    CMP32ri %0, 1000001, implicit-def $eflags136    %7:gr32 = COPY %0137    JCC_1 %bb.1, 2, implicit killed $eflags138    JMP_1 %bb.2139 140  bb.2.leave:141    $eax = COPY killed %7142    RET 0, killed $eax143 144...145 146