Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / DebugInfo / MIR / InstrRef / x86-lea-fixup.mir
blobb84f86c032cc45772596de0e411042e8d6cfad9f
1 # RUN: llc -run-pass x86-fixup-LEAs -mtriple=x86_64-gnu-unknown -verify-machineinstrs -mcpu=corei7-avx -o - %s | FileCheck %s --check-prefixes=COREI7,CHECK
2 # RUN: llc -run-pass x86-fixup-LEAs -mtriple=x86_64-gnu-unknown -verify-machineinstrs -mcpu=haswell -o - %s | FileCheck %s --check-prefixes=HASWELL,CHECK
3 # RUN: llc -run-pass x86-fixup-LEAs -mtriple=x86_64-unknown-unknown -verify-machineinstrs -mcpu=atom -o - %s | FileCheck %s --check-prefixes=ATOM,CHECK
5 # Test several LEA <=> ADD transformations that the fixup-leas pass performs,
6 # and check that any debug-instr-number attached to the original instruction
7 # is substituted onto the new instruction.
8 # Some are only reachable under specific CPU modes it seems -- each function
9 # in this file is only tested by one prefix / CPU mode. Some i386 specific
10 # behaviours are in the -2 flavour of this file.
11 ---
12 # COREI7-LABEL: name: pr43758
13 name:            pr43758
14 alignment:       16
15 tracksRegLiveness: true
16 debugInstrRef: true
17 liveins:
18   - { reg: '$rax' }
19   - { reg: '$rbp' }
20 # COREI7:      debugValueSubstitutions:
21 # COREI7-NEXT: - { srcinst: 1, srcop: 0, dstinst: 2, dstop: 0, subreg: 0 }
22 body:             |
23   bb.0:
24     liveins: $rax, $rbp
26     $ebp = LEA64_32r killed $rbp, 1, killed $rax, 0, $noreg, debug-instr-number 1
27     ; COREI7: ADD32rr {{.*}} debug-instr-number 2
28     RET64 $ebp
30 ...
31 ---
32 name:            test_mul_spec
33 # HASWELL-LABEL: name: test_mul_spec
34 alignment:       16
35 tracksRegLiveness: true
36 debugInstrRef: true
37 liveins:
38   - { reg: '$edi' }
39 frameInfo:
40   maxAlignment:    1
41   maxCallFrameSize: 0
42 machineFunctionInfo: {}
43 # HASWELL:      debugValueSubstitutions:
44 # HASWELL-NEXT:  - { srcinst: 1, srcop: 0, dstinst: 3, dstop: 0, subreg: 0 }
45 # HASWELL-NEXT:  - { srcinst: 2, srcop: 0, dstinst: 4, dstop: 0, subreg: 0 }
46 body:             |
47   bb.0:
48     liveins: $edi
49   
50     renamable $edi = KILL $edi, implicit-def $rdi
51     renamable $ecx = nsw LEA64_32r renamable $rdi, 8, renamable $rdi, 42, $noreg, debug-instr-number 1
52     ; HASWELL: ADD32ri {{.*}} debug-instr-number 3
53     renamable $eax = nsw LEA64_32r killed renamable $rdi, 4, renamable $rdi, 2, $noreg, debug-instr-number 2
54     ; HASWELL: ADD32ri {{.*}} debug-instr-number 4
55     renamable $eax = nsw IMUL32rr killed renamable $eax, killed renamable $ecx, implicit-def dead $eflags
56     RET64 $eax
58 ...
59 ---
60 name:            testthree
61 # ATOM-LABEL: name: testthree
62 alignment:       16
63 tracksRegLiveness: true
64 debugInstrRef: true
65 frameInfo:
66   maxAlignment:    1
67   maxCallFrameSize: 0
68 machineFunctionInfo: {}
69 # ATOM:       debugValueSubstitutions:
70 # ATOM-NEXT:  - { srcinst: 1, srcop: 0, dstinst: 2, dstop: 0, subreg: 0 }
71 body:             |
72   bb.0.entry:
73     renamable $ecx = MOV32ri 0
74     renamable $eax = XOR32rr undef $eax, undef $eax, implicit-def dead $eflags
75     renamable $ecx = nsw ADD32rr renamable $ecx, renamable $eax, implicit-def dead $eflags, implicit killed $rax, implicit killed $rcx, implicit-def $rcx, debug-instr-number 1
76     ; ATOM: LEA64_32r {{.*}} debug-instr-number 2
77     renamable $eax = MOV32rm killed renamable $rcx, 1, $noreg, 0, $noreg :: (load (s32) from `i32 *undef`)
78     RET64 $eax
80 ...
81 ---
82 # CHECK-LABEL: testfour
83 # In this code sequence, an LEA is converted into a subtract that's combined
84 # with another subtract. The instruction number on the computed value should
85 # only be attached to the last subtract.
86 name:            testfour
87 alignment:       16
88 tracksRegLiveness: true
89 tracksDebugUserValues: true
90 debugInstrRef: true
91 liveins:
92   - { reg: '$esi' }
93 frameInfo:
94   maxAlignment:    1
95   maxCallFrameSize: 0
96 machineFunctionInfo: {}
97 # CHECK:      debugValueSubstitutions:
98 # CHECK-NEXT:  - { srcinst: 1, srcop: 0, dstinst: 2, dstop: 0, subreg: 0 }
99 # CHECK-NEXT: constants:
100 body:             |
101   bb.0.entry:
102     liveins: $esi
104     $eax = MOV32rr $esi, implicit-def $rax
106     renamable $ecx = LEA64_32r renamable $rax, 1, renamable $rax, 0, $noreg
107     renamable $edx = MOV32ri 1
108     renamable $edx = SUB32rr killed renamable $edx, killed renamable $ecx, implicit-def dead $eflags, debug-instr-number 1
110     ; CHECK:      MOV32ri 1
111     ; CHECK-NOT:  debug-instr-number
112     ; CHECK-NEXT: SUB32rr
113     ; CHECK-NOT:  debug-instr-number
114     ; CHECK-NEXT: SUB32rr
115     ; CHECK-SAME: debug-instr-number 2
117     MOV32mr $noreg, 1, $noreg, 0, $noreg, killed renamable $edx
118     $eax = KILL renamable $eax, implicit killed $rax
119     RET64 $eax