xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/rd-mod-wr-eflags.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker%struct.obj = type { i64 }
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; CHECK: _Z7releaseP3obj
6*9880d681SAndroid Build Coastguard Workerdefine void @_Z7releaseP3obj(%struct.obj* nocapture %o) nounwind uwtable ssp {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker; CHECK: decq	(%{{rdi|rcx}})
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
10*9880d681SAndroid Build Coastguard Worker  %refcnt = getelementptr inbounds %struct.obj, %struct.obj* %o, i64 0, i32 0
11*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %refcnt, align 8
12*9880d681SAndroid Build Coastguard Worker  %dec = add i64 %0, -1
13*9880d681SAndroid Build Coastguard Worker  store i64 %dec, i64* %refcnt, align 8
14*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %dec, 0
15*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.end, label %return
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry
18*9880d681SAndroid Build Coastguard Worker  %1 = bitcast %struct.obj* %o to i8*
19*9880d681SAndroid Build Coastguard Worker  tail call void @free(i8* %1)
20*9880d681SAndroid Build Coastguard Worker  br label %return
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %entry, %if.end
23*9880d681SAndroid Build Coastguard Worker  ret void
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker@c = common global i64 0, align 8
27*9880d681SAndroid Build Coastguard Worker@a = common global i32 0, align 4
28*9880d681SAndroid Build Coastguard Worker@.str = private unnamed_addr constant [5 x i8] c"%ld\0A\00", align 1
29*9880d681SAndroid Build Coastguard Worker@b = common global i32 0, align 4
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; CHECK: test
32*9880d681SAndroid Build Coastguard Workerdefine i32 @test() nounwind uwtable ssp {
33*9880d681SAndroid Build Coastguard Workerentry:
34*9880d681SAndroid Build Coastguard Worker; CHECK: decq
35*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: decq
36*9880d681SAndroid Build Coastguard Worker%0 = load i64, i64* @c, align 8
37*9880d681SAndroid Build Coastguard Worker%dec.i = add nsw i64 %0, -1
38*9880d681SAndroid Build Coastguard Workerstore i64 %dec.i, i64* @c, align 8
39*9880d681SAndroid Build Coastguard Worker%tobool.i = icmp ne i64 %dec.i, 0
40*9880d681SAndroid Build Coastguard Worker%lor.ext.i = zext i1 %tobool.i to i32
41*9880d681SAndroid Build Coastguard Workerstore i32 %lor.ext.i, i32* @a, align 4
42*9880d681SAndroid Build Coastguard Worker%call = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i64 %dec.i) nounwind
43*9880d681SAndroid Build Coastguard Workerret i32 0
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; CHECK: test2
47*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() nounwind uwtable ssp {
48*9880d681SAndroid Build Coastguard Workerentry:
49*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: decq ({{.*}})
50*9880d681SAndroid Build Coastguard Worker%0 = load i64, i64* @c, align 8
51*9880d681SAndroid Build Coastguard Worker%dec.i = add nsw i64 %0, -1
52*9880d681SAndroid Build Coastguard Workerstore i64 %dec.i, i64* @c, align 8
53*9880d681SAndroid Build Coastguard Worker%tobool.i = icmp ne i64 %0, 0
54*9880d681SAndroid Build Coastguard Worker%lor.ext.i = zext i1 %tobool.i to i32
55*9880d681SAndroid Build Coastguard Workerstore i32 %lor.ext.i, i32* @a, align 4
56*9880d681SAndroid Build Coastguard Worker%call = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i64 %dec.i) nounwind
57*9880d681SAndroid Build Coastguard Workerret i32 0
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdeclare i32 @printf(i8* nocapture, ...) nounwind
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdeclare void @free(i8* nocapture) nounwind
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker%struct.obj2 = type { i64, i32, i16, i8 }
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerdeclare void @other(%struct.obj2* ) nounwind;
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; CHECK: example_dec
69*9880d681SAndroid Build Coastguard Workerdefine void @example_dec(%struct.obj2* %o) nounwind uwtable ssp {
70*9880d681SAndroid Build Coastguard Worker; 64 bit dec
71*9880d681SAndroid Build Coastguard Workerentry:
72*9880d681SAndroid Build Coastguard Worker  %s64 = getelementptr inbounds %struct.obj2, %struct.obj2* %o, i64 0, i32 0
73*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
74*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %s64, align 8
75*9880d681SAndroid Build Coastguard Worker; CHECK: decq ({{.*}})
76*9880d681SAndroid Build Coastguard Worker  %dec = add i64 %0, -1
77*9880d681SAndroid Build Coastguard Worker  store i64 %dec, i64* %s64, align 8
78*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %dec, 0
79*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.end, label %return
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; 32 bit dec
82*9880d681SAndroid Build Coastguard Workerif.end:
83*9880d681SAndroid Build Coastguard Worker  %s32 = getelementptr inbounds %struct.obj2, %struct.obj2* %o, i64 0, i32 1
84*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
85*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %s32, align 4
86*9880d681SAndroid Build Coastguard Worker; CHECK: decl {{[0-9][0-9]*}}({{.*}})
87*9880d681SAndroid Build Coastguard Worker  %dec1 = add i32 %1, -1
88*9880d681SAndroid Build Coastguard Worker  store i32 %dec1, i32* %s32, align 4
89*9880d681SAndroid Build Coastguard Worker  %tobool2 = icmp eq i32 %dec1, 0
90*9880d681SAndroid Build Coastguard Worker  br i1 %tobool2, label %if.end1, label %return
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; 16 bit dec
93*9880d681SAndroid Build Coastguard Workerif.end1:
94*9880d681SAndroid Build Coastguard Worker  %s16 = getelementptr inbounds %struct.obj2, %struct.obj2* %o, i64 0, i32 2
95*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
96*9880d681SAndroid Build Coastguard Worker  %2 = load i16, i16* %s16, align 2
97*9880d681SAndroid Build Coastguard Worker; CHECK: decw {{[0-9][0-9]*}}({{.*}})
98*9880d681SAndroid Build Coastguard Worker  %dec2 = add i16 %2, -1
99*9880d681SAndroid Build Coastguard Worker  store i16 %dec2, i16* %s16, align 2
100*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i16 %dec2, 0
101*9880d681SAndroid Build Coastguard Worker  br i1 %tobool3, label %if.end2, label %return
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; 8 bit dec
104*9880d681SAndroid Build Coastguard Workerif.end2:
105*9880d681SAndroid Build Coastguard Worker  %s8 = getelementptr inbounds %struct.obj2, %struct.obj2* %o, i64 0, i32 3
106*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
107*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %s8
108*9880d681SAndroid Build Coastguard Worker; CHECK: decb {{[0-9][0-9]*}}({{.*}})
109*9880d681SAndroid Build Coastguard Worker  %dec3 = add i8 %3, -1
110*9880d681SAndroid Build Coastguard Worker  store i8 %dec3, i8* %s8
111*9880d681SAndroid Build Coastguard Worker  %tobool4 = icmp eq i8 %dec3, 0
112*9880d681SAndroid Build Coastguard Worker  br i1 %tobool4, label %if.end4, label %return
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerif.end4:
115*9880d681SAndroid Build Coastguard Worker  tail call void @other(%struct.obj2* %o) nounwind
116*9880d681SAndroid Build Coastguard Worker  br label %return
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end4, %if.end, %entry
119*9880d681SAndroid Build Coastguard Worker  ret void
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; CHECK: example_inc
123*9880d681SAndroid Build Coastguard Workerdefine void @example_inc(%struct.obj2* %o) nounwind uwtable ssp {
124*9880d681SAndroid Build Coastguard Worker; 64 bit inc
125*9880d681SAndroid Build Coastguard Workerentry:
126*9880d681SAndroid Build Coastguard Worker  %s64 = getelementptr inbounds %struct.obj2, %struct.obj2* %o, i64 0, i32 0
127*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
128*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %s64, align 8
129*9880d681SAndroid Build Coastguard Worker; CHECK: incq ({{.*}})
130*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %0, 1
131*9880d681SAndroid Build Coastguard Worker  store i64 %inc, i64* %s64, align 8
132*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %inc, 0
133*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.end, label %return
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; 32 bit inc
136*9880d681SAndroid Build Coastguard Workerif.end:
137*9880d681SAndroid Build Coastguard Worker  %s32 = getelementptr inbounds %struct.obj2, %struct.obj2* %o, i64 0, i32 1
138*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
139*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %s32, align 4
140*9880d681SAndroid Build Coastguard Worker; CHECK: incl {{[0-9][0-9]*}}({{.*}})
141*9880d681SAndroid Build Coastguard Worker  %inc1 = add i32 %1, 1
142*9880d681SAndroid Build Coastguard Worker  store i32 %inc1, i32* %s32, align 4
143*9880d681SAndroid Build Coastguard Worker  %tobool2 = icmp eq i32 %inc1, 0
144*9880d681SAndroid Build Coastguard Worker  br i1 %tobool2, label %if.end1, label %return
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; 16 bit inc
147*9880d681SAndroid Build Coastguard Workerif.end1:
148*9880d681SAndroid Build Coastguard Worker  %s16 = getelementptr inbounds %struct.obj2, %struct.obj2* %o, i64 0, i32 2
149*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
150*9880d681SAndroid Build Coastguard Worker  %2 = load i16, i16* %s16, align 2
151*9880d681SAndroid Build Coastguard Worker; CHECK: incw {{[0-9][0-9]*}}({{.*}})
152*9880d681SAndroid Build Coastguard Worker  %inc2 = add i16 %2, 1
153*9880d681SAndroid Build Coastguard Worker  store i16 %inc2, i16* %s16, align 2
154*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i16 %inc2, 0
155*9880d681SAndroid Build Coastguard Worker  br i1 %tobool3, label %if.end2, label %return
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; 8 bit inc
158*9880d681SAndroid Build Coastguard Workerif.end2:
159*9880d681SAndroid Build Coastguard Worker  %s8 = getelementptr inbounds %struct.obj2, %struct.obj2* %o, i64 0, i32 3
160*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
161*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %s8
162*9880d681SAndroid Build Coastguard Worker; CHECK: incb {{[0-9][0-9]*}}({{.*}})
163*9880d681SAndroid Build Coastguard Worker  %inc3 = add i8 %3, 1
164*9880d681SAndroid Build Coastguard Worker  store i8 %inc3, i8* %s8
165*9880d681SAndroid Build Coastguard Worker  %tobool4 = icmp eq i8 %inc3, 0
166*9880d681SAndroid Build Coastguard Worker  br i1 %tobool4, label %if.end4, label %return
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerif.end4:
169*9880d681SAndroid Build Coastguard Worker  tail call void @other(%struct.obj2* %o) nounwind
170*9880d681SAndroid Build Coastguard Worker  br label %return
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerreturn:
173*9880d681SAndroid Build Coastguard Worker  ret void
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker; Deal with TokenFactor chain
177*9880d681SAndroid Build Coastguard Worker; rdar://11236106
178*9880d681SAndroid Build Coastguard Worker@foo = external global i64*, align 8
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerdefine void @test3() nounwind ssp {
181*9880d681SAndroid Build Coastguard Workerentry:
182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3:
183*9880d681SAndroid Build Coastguard Worker; CHECK: decq 16(%rax)
184*9880d681SAndroid Build Coastguard Worker  %0 = load i64*, i64** @foo, align 8
185*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i64, i64* %0, i64 2
186*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* %arrayidx, align 8
187*9880d681SAndroid Build Coastguard Worker  %dec = add i64 %1, -1
188*9880d681SAndroid Build Coastguard Worker  store i64 %dec, i64* %arrayidx, align 8
189*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64 %dec, 0
190*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerif.then:
193*9880d681SAndroid Build Coastguard Worker  tail call void @baz() nounwind
194*9880d681SAndroid Build Coastguard Worker  br label %if.end
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Workerif.end:
197*9880d681SAndroid Build Coastguard Worker  ret void
198*9880d681SAndroid Build Coastguard Worker}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerdeclare void @baz()
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker; Avoid creating a cycle in the DAG which would trigger an assert in the
203*9880d681SAndroid Build Coastguard Worker; scheduler.
204*9880d681SAndroid Build Coastguard Worker; PR12565
205*9880d681SAndroid Build Coastguard Worker; rdar://11451474
206*9880d681SAndroid Build Coastguard Worker@x = external global i32, align 4
207*9880d681SAndroid Build Coastguard Worker@y = external global i32, align 4
208*9880d681SAndroid Build Coastguard Worker@z = external global i32, align 4
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerdefine void @test4() nounwind uwtable ssp {
211*9880d681SAndroid Build Coastguard Workerentry:
212*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @x, align 4
213*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @y, align 4
214*9880d681SAndroid Build Coastguard Worker  %dec = add nsw i32 %1, -1
215*9880d681SAndroid Build Coastguard Worker  store i32 %dec, i32* @y, align 4
216*9880d681SAndroid Build Coastguard Worker  %tobool.i = icmp ne i32 %dec, 0
217*9880d681SAndroid Build Coastguard Worker  %cond.i = select i1 %tobool.i, i32 %0, i32 0
218*9880d681SAndroid Build Coastguard Worker  store i32 %cond.i, i32* @z, align 4
219*9880d681SAndroid Build Coastguard Worker  ret void
220*9880d681SAndroid Build Coastguard Worker}
221