Taints the non-acquire RMW's store address with the load part
[oota-llvm.git] / test / CodeGen / Mips / mips64intldst.ll
1 ; RUN: llc  < %s -march=mips64el -mcpu=mips4 -target-abi n64 | FileCheck %s -check-prefix=CHECK-N64
2 ; RUN: llc  < %s -march=mips64el -mcpu=mips4 -target-abi n32 | FileCheck %s -check-prefix=CHECK-N32
3 ; RUN: llc  < %s -march=mips64el -mcpu=mips64 -target-abi n64 | FileCheck %s -check-prefix=CHECK-N64
4 ; RUN: llc  < %s -march=mips64el -mcpu=mips64 -target-abi n32 | FileCheck %s -check-prefix=CHECK-N32
5
6 @c = common global i8 0, align 4
7 @s = common global i16 0, align 4
8 @i = common global i32 0, align 4
9 @l = common global i64 0, align 8
10 @uc = common global i8 0, align 4
11 @us = common global i16 0, align 4
12 @ui = common global i32 0, align 4
13 @l1 = common global i64 0, align 8
14
15 define i64 @func1() nounwind readonly {
16 entry:
17 ; CHECK-N64: func1
18 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(c)
19 ; CHECK-N64: lb ${{[0-9]+}}, 0($[[R0]])
20 ; CHECK-N32: func1
21 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(c)
22 ; CHECK-N32: lb ${{[0-9]+}}, 0($[[R0]])
23   %0 = load i8, i8* @c, align 4
24   %conv = sext i8 %0 to i64
25   ret i64 %conv
26 }
27
28 define i64 @func2() nounwind readonly {
29 entry:
30 ; CHECK-N64: func2
31 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(s)
32 ; CHECK-N64: lh ${{[0-9]+}}, 0($[[R0]])
33 ; CHECK-N32: func2
34 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(s)
35 ; CHECK-N32: lh ${{[0-9]+}}, 0($[[R0]])
36   %0 = load i16, i16* @s, align 4
37   %conv = sext i16 %0 to i64
38   ret i64 %conv
39 }
40
41 define i64 @func3() nounwind readonly {
42 entry:
43 ; CHECK-N64: func3
44 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(i)
45 ; CHECK-N64: lw ${{[0-9]+}}, 0($[[R0]])
46 ; CHECK-N32: func3
47 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(i)
48 ; CHECK-N32: lw ${{[0-9]+}}, 0($[[R0]])
49   %0 = load i32, i32* @i, align 4
50   %conv = sext i32 %0 to i64
51   ret i64 %conv
52 }
53
54 define i64 @func4() nounwind readonly {
55 entry:
56 ; CHECK-N64: func4
57 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(l)
58 ; CHECK-N64: ld ${{[0-9]+}}, 0($[[R0]])
59 ; CHECK-N32: func4
60 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(l)
61 ; CHECK-N32: ld ${{[0-9]+}}, 0($[[R0]])
62   %0 = load i64, i64* @l, align 8
63   ret i64 %0
64 }
65
66 define i64 @ufunc1() nounwind readonly {
67 entry:
68 ; CHECK-N64: ufunc1
69 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(uc)
70 ; CHECK-N64: lbu ${{[0-9]+}}, 0($[[R0]])
71 ; CHECK-N32: ufunc1
72 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(uc)
73 ; CHECK-N32: lbu ${{[0-9]+}}, 0($[[R0]])
74   %0 = load i8, i8* @uc, align 4
75   %conv = zext i8 %0 to i64
76   ret i64 %conv
77 }
78
79 define i64 @ufunc2() nounwind readonly {
80 entry:
81 ; CHECK-N64: ufunc2
82 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(us)
83 ; CHECK-N64: lhu ${{[0-9]+}}, 0($[[R0]])
84 ; CHECK-N32: ufunc2
85 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(us)
86 ; CHECK-N32: lhu ${{[0-9]+}}, 0($[[R0]])
87   %0 = load i16, i16* @us, align 4
88   %conv = zext i16 %0 to i64
89   ret i64 %conv
90 }
91
92 define i64 @ufunc3() nounwind readonly {
93 entry:
94 ; CHECK-N64: ufunc3
95 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(ui)
96 ; CHECK-N64: lwu ${{[0-9]+}}, 0($[[R0]])
97 ; CHECK-N32: ufunc3
98 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(ui)
99 ; CHECK-N32: lwu ${{[0-9]+}}, 0($[[R0]])
100   %0 = load i32, i32* @ui, align 4
101   %conv = zext i32 %0 to i64
102   ret i64 %conv
103 }
104
105 define void @sfunc1() nounwind {
106 entry:
107 ; CHECK-N64: sfunc1
108 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(c)
109 ; CHECK-N64: sb ${{[0-9]+}}, 0($[[R0]])
110 ; CHECK-N32: sfunc1
111 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(c)
112 ; CHECK-N32: sb ${{[0-9]+}}, 0($[[R0]])
113   %0 = load i64, i64* @l1, align 8
114   %conv = trunc i64 %0 to i8
115   store i8 %conv, i8* @c, align 4
116   ret void
117 }
118
119 define void @sfunc2() nounwind {
120 entry:
121 ; CHECK-N64: sfunc2
122 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(s)
123 ; CHECK-N64: sh ${{[0-9]+}}, 0($[[R0]])
124 ; CHECK-N32: sfunc2
125 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(s)
126 ; CHECK-N32: sh ${{[0-9]+}}, 0($[[R0]])
127   %0 = load i64, i64* @l1, align 8
128   %conv = trunc i64 %0 to i16
129   store i16 %conv, i16* @s, align 4
130   ret void
131 }
132
133 define void @sfunc3() nounwind {
134 entry:
135 ; CHECK-N64: sfunc3
136 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(i)
137 ; CHECK-N64: sw ${{[0-9]+}}, 0($[[R0]])
138 ; CHECK-N32: sfunc3
139 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(i)
140 ; CHECK-N32: sw ${{[0-9]+}}, 0($[[R0]])
141   %0 = load i64, i64* @l1, align 8
142   %conv = trunc i64 %0 to i32
143   store i32 %conv, i32* @i, align 4
144   ret void
145 }
146
147 define void @sfunc4() nounwind {
148 entry:
149 ; CHECK-N64: sfunc4
150 ; CHECK-N64: ld $[[R0:[0-9]+]], %got_disp(l)
151 ; CHECK-N64: sd ${{[0-9]+}}, 0($[[R0]])
152 ; CHECK-N32: sfunc4
153 ; CHECK-N32: lw $[[R0:[0-9]+]], %got_disp(l)
154 ; CHECK-N32: sd ${{[0-9]+}}, 0($[[R0]])
155   %0 = load i64, i64* @l1, align 8
156   store i64 %0, i64* @l, align 8
157   ret void
158 }
159