54e9cc47ba0e3b69733bd07ee2d54325602a8ac6
[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 ...
47 ---
48 name:            test
49 tracksRegLiveness: true
50 liveins:
51   - { reg: '%rdi' }
52 body:
53   - id:          0
54     name:        entry
55     liveins:     [ '%rdi' ]
56     instructions:
57 # CHECK:      %eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)
58 # CHECK-NEXT: MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)
59       - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)'
60       - 'MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)'
61       - 'RETQ %eax'
62 ...
63 ---
64 name:            test2
65 tracksRegLiveness: true
66 liveins:
67   - { reg: '%rdi' }
68 body:
69   - id:          0
70     name:        entry2
71     liveins:     [ '%rdi' ]
72     instructions:
73 # CHECK: INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")
74       - 'INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")'
75       - RETQ
76 ...
77 ---
78 name:            volatile_inc
79 tracksRegLiveness: true
80 liveins:
81   - { reg: '%rdi' }
82 body:
83   - id:          0
84     name:        entry
85     liveins:     [ '%rdi' ]
86     instructions:
87     # CHECK: name: volatile_inc
88     # CHECK: %eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)
89     # CHECK: MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)
90       - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)'
91       - '%eax = INC32r killed %eax, implicit-def dead %eflags'
92       - 'MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)'
93       - 'RETQ %eax'
94 ...
95 ---
96 name:            non_temporal_store
97 tracksRegLiveness: true
98 liveins:
99   - { reg: '%rdi' }
100   - { reg: '%esi' }
101 body:
102   - id:          0
103     name:        entry
104     liveins:     [ '%esi', '%rdi' ]
105     instructions:
106 # CHECK: name: non_temporal_store
107 # CHECK: MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)
108       - 'MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)'
109       - RETQ
110 ...
111 ---
112 name:            invariant_load
113 tracksRegLiveness: true
114 liveins:
115   - { reg: '%rdi' }
116 body:
117   - id:          0
118     name:        entry
119     liveins:     [ '%rdi' ]
120     instructions:
121 # CHECK: name: invariant_load
122 # CHECK: %eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)
123       - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)'
124       - 'RETQ %eax'
125 ...