MIR Serialization: Serialize the offsets for the machine memory operands.
[oota-llvm.git] / test / CodeGen / MIR / X86 / memory-operands.mir
1 # RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s
2 # This test ensures that the MIR parser parses the machine memory operands
3 # correctly.
4
5 --- |
6
7   define i32 @test(i32* %a) {
8   entry:
9     %b = load i32, i32* %a
10     store i32 42, i32* %a
11     ret i32 %b
12   }
13
14   define void @test2(i32* %"a value") {
15   entry2:
16     %b = load i32, i32* %"a value"
17     %c = add i32 %b, 1
18     store i32 %c, i32* %"a value"
19     ret void
20   }
21
22   define i32 @volatile_inc(i32* %x) {
23   entry:
24     %0 = load volatile i32, i32* %x
25     %1 = add i32 %0, 1
26     store volatile i32 %1, i32* %x
27     ret i32 %1
28   }
29
30   define void @non_temporal_store(i32* %a, i32 %b) {
31   entry:
32     store i32 %b, i32* %a, align 16, !nontemporal !0
33     ret void
34   }
35
36   !0 = !{i32 1}
37
38   define i32 @invariant_load(i32* %x) {
39   entry:
40     %v = load i32, i32* %x, !invariant.load !1
41     ret i32 %v
42   }
43
44   !1 = !{}
45
46   define void @memory_offset(<8 x float>* %vec) {
47   entry:
48     %v = load <8 x float>, <8 x float>* %vec
49     %v2 = insertelement <8 x float> %v, float 0.0, i32 4
50     store <8 x float> %v2, <8 x float>* %vec
51     ret void
52   }
53
54 ...
55 ---
56 name:            test
57 tracksRegLiveness: true
58 liveins:
59   - { reg: '%rdi' }
60 body:
61   - id:          0
62     name:        entry
63     liveins:     [ '%rdi' ]
64     instructions:
65 # CHECK:      %eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)
66 # CHECK-NEXT: MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)
67       - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)'
68       - 'MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)'
69       - 'RETQ %eax'
70 ...
71 ---
72 name:            test2
73 tracksRegLiveness: true
74 liveins:
75   - { reg: '%rdi' }
76 body:
77   - id:          0
78     name:        entry2
79     liveins:     [ '%rdi' ]
80     instructions:
81 # CHECK: INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")
82       - 'INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")'
83       - RETQ
84 ...
85 ---
86 name:            volatile_inc
87 tracksRegLiveness: true
88 liveins:
89   - { reg: '%rdi' }
90 body:
91   - id:          0
92     name:        entry
93     liveins:     [ '%rdi' ]
94     instructions:
95     # CHECK: name: volatile_inc
96     # CHECK: %eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)
97     # CHECK: MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)
98       - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)'
99       - '%eax = INC32r killed %eax, implicit-def dead %eflags'
100       - 'MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)'
101       - 'RETQ %eax'
102 ...
103 ---
104 name:            non_temporal_store
105 tracksRegLiveness: true
106 liveins:
107   - { reg: '%rdi' }
108   - { reg: '%esi' }
109 body:
110   - id:          0
111     name:        entry
112     liveins:     [ '%esi', '%rdi' ]
113     instructions:
114 # CHECK: name: non_temporal_store
115 # CHECK: MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)
116       - 'MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)'
117       - RETQ
118 ...
119 ---
120 name:            invariant_load
121 tracksRegLiveness: true
122 liveins:
123   - { reg: '%rdi' }
124 body:
125   - id:          0
126     name:        entry
127     liveins:     [ '%rdi' ]
128     instructions:
129 # CHECK: name: invariant_load
130 # CHECK: %eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)
131       - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)'
132       - 'RETQ %eax'
133 ...
134 ---
135 name:            memory_offset
136 tracksRegLiveness: true
137 liveins:
138   - { reg: '%rdi' }
139 body:
140   - id:          0
141     name:        entry
142     liveins:     [ '%rdi' ]
143     instructions:
144 # CHECK: name: memory_offset
145 # CHECK:      %xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec)
146 # CHECK-NEXT: %xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16)
147 # CHECK:      MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec)
148 # CHECK-NEXT: MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16)
149       - '%xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec)'
150       - '%xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16)'
151       - '%xmm2 = FsFLD0SS'
152       - '%xmm1 = MOVSSrr killed %xmm1, killed %xmm2'
153       - 'MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec)'
154       - 'MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16)'
155       - RETQ
156 ...