xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-addr-mode-folding.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O3 -mtriple arm64-apple-ios3 -aarch64-gep-opt=false %s -o - | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; <rdar://problem/13621857>
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker@block = common global i8* null, align 8
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine i32 @fct(i32 %i1, i32 %i2) {
7*9880d681SAndroid Build Coastguard Worker; CHECK: @fct
8*9880d681SAndroid Build Coastguard Worker; Sign extension is used more than once, thus it should not be folded.
9*9880d681SAndroid Build Coastguard Worker; CodeGenPrepare is not sharing sext across uses, thus this is folded because
10*9880d681SAndroid Build Coastguard Worker; of that.
11*9880d681SAndroid Build Coastguard Worker; _CHECK-NOT_: , sxtw]
12*9880d681SAndroid Build Coastguard Workerentry:
13*9880d681SAndroid Build Coastguard Worker  %idxprom = sext i32 %i1 to i64
14*9880d681SAndroid Build Coastguard Worker  %0 = load i8*, i8** @block, align 8
15*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %0, i64 %idxprom
16*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* %arrayidx, align 1
17*9880d681SAndroid Build Coastguard Worker  %idxprom1 = sext i32 %i2 to i64
18*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i8, i8* %0, i64 %idxprom1
19*9880d681SAndroid Build Coastguard Worker  %2 = load i8, i8* %arrayidx2, align 1
20*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %1, %2
21*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.end, label %if.then
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
24*9880d681SAndroid Build Coastguard Worker  %cmp7 = icmp ugt i8 %1, %2
25*9880d681SAndroid Build Coastguard Worker  %conv8 = zext i1 %cmp7 to i32
26*9880d681SAndroid Build Coastguard Worker  br label %return
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry
29*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %i1, 1
30*9880d681SAndroid Build Coastguard Worker  %inc9 = add nsw i32 %i2, 1
31*9880d681SAndroid Build Coastguard Worker  %idxprom10 = sext i32 %inc to i64
32*9880d681SAndroid Build Coastguard Worker  %arrayidx11 = getelementptr inbounds i8, i8* %0, i64 %idxprom10
33*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %arrayidx11, align 1
34*9880d681SAndroid Build Coastguard Worker  %idxprom12 = sext i32 %inc9 to i64
35*9880d681SAndroid Build Coastguard Worker  %arrayidx13 = getelementptr inbounds i8, i8* %0, i64 %idxprom12
36*9880d681SAndroid Build Coastguard Worker  %4 = load i8, i8* %arrayidx13, align 1
37*9880d681SAndroid Build Coastguard Worker  %cmp16 = icmp eq i8 %3, %4
38*9880d681SAndroid Build Coastguard Worker  br i1 %cmp16, label %if.end23, label %if.then18
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerif.then18:                                        ; preds = %if.end
41*9880d681SAndroid Build Coastguard Worker  %cmp21 = icmp ugt i8 %3, %4
42*9880d681SAndroid Build Coastguard Worker  %conv22 = zext i1 %cmp21 to i32
43*9880d681SAndroid Build Coastguard Worker  br label %return
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerif.end23:                                         ; preds = %if.end
46*9880d681SAndroid Build Coastguard Worker  %inc24 = add nsw i32 %i1, 2
47*9880d681SAndroid Build Coastguard Worker  %inc25 = add nsw i32 %i2, 2
48*9880d681SAndroid Build Coastguard Worker  %idxprom26 = sext i32 %inc24 to i64
49*9880d681SAndroid Build Coastguard Worker  %arrayidx27 = getelementptr inbounds i8, i8* %0, i64 %idxprom26
50*9880d681SAndroid Build Coastguard Worker  %5 = load i8, i8* %arrayidx27, align 1
51*9880d681SAndroid Build Coastguard Worker  %idxprom28 = sext i32 %inc25 to i64
52*9880d681SAndroid Build Coastguard Worker  %arrayidx29 = getelementptr inbounds i8, i8* %0, i64 %idxprom28
53*9880d681SAndroid Build Coastguard Worker  %6 = load i8, i8* %arrayidx29, align 1
54*9880d681SAndroid Build Coastguard Worker  %cmp32 = icmp eq i8 %5, %6
55*9880d681SAndroid Build Coastguard Worker  br i1 %cmp32, label %return, label %if.then34
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerif.then34:                                        ; preds = %if.end23
58*9880d681SAndroid Build Coastguard Worker  %cmp37 = icmp ugt i8 %5, %6
59*9880d681SAndroid Build Coastguard Worker  %conv38 = zext i1 %cmp37 to i32
60*9880d681SAndroid Build Coastguard Worker  br label %return
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end23, %if.then34, %if.then18, %if.then
63*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %conv8, %if.then ], [ %conv22, %if.then18 ], [ %conv38, %if.then34 ], [ 1, %if.end23 ]
64*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine i32 @fct1(i32 %i1, i32 %i2) optsize {
68*9880d681SAndroid Build Coastguard Worker; CHECK: @fct1
69*9880d681SAndroid Build Coastguard Worker; Addressing are folded when optimizing for code size.
70*9880d681SAndroid Build Coastguard Worker; CHECK: , sxtw]
71*9880d681SAndroid Build Coastguard Worker; CHECK: , sxtw]
72*9880d681SAndroid Build Coastguard Workerentry:
73*9880d681SAndroid Build Coastguard Worker  %idxprom = sext i32 %i1 to i64
74*9880d681SAndroid Build Coastguard Worker  %0 = load i8*, i8** @block, align 8
75*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %0, i64 %idxprom
76*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* %arrayidx, align 1
77*9880d681SAndroid Build Coastguard Worker  %idxprom1 = sext i32 %i2 to i64
78*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i8, i8* %0, i64 %idxprom1
79*9880d681SAndroid Build Coastguard Worker  %2 = load i8, i8* %arrayidx2, align 1
80*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %1, %2
81*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.end, label %if.then
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
84*9880d681SAndroid Build Coastguard Worker  %cmp7 = icmp ugt i8 %1, %2
85*9880d681SAndroid Build Coastguard Worker  %conv8 = zext i1 %cmp7 to i32
86*9880d681SAndroid Build Coastguard Worker  br label %return
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry
89*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %i1, 1
90*9880d681SAndroid Build Coastguard Worker  %inc9 = add nsw i32 %i2, 1
91*9880d681SAndroid Build Coastguard Worker  %idxprom10 = sext i32 %inc to i64
92*9880d681SAndroid Build Coastguard Worker  %arrayidx11 = getelementptr inbounds i8, i8* %0, i64 %idxprom10
93*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %arrayidx11, align 1
94*9880d681SAndroid Build Coastguard Worker  %idxprom12 = sext i32 %inc9 to i64
95*9880d681SAndroid Build Coastguard Worker  %arrayidx13 = getelementptr inbounds i8, i8* %0, i64 %idxprom12
96*9880d681SAndroid Build Coastguard Worker  %4 = load i8, i8* %arrayidx13, align 1
97*9880d681SAndroid Build Coastguard Worker  %cmp16 = icmp eq i8 %3, %4
98*9880d681SAndroid Build Coastguard Worker  br i1 %cmp16, label %if.end23, label %if.then18
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerif.then18:                                        ; preds = %if.end
101*9880d681SAndroid Build Coastguard Worker  %cmp21 = icmp ugt i8 %3, %4
102*9880d681SAndroid Build Coastguard Worker  %conv22 = zext i1 %cmp21 to i32
103*9880d681SAndroid Build Coastguard Worker  br label %return
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerif.end23:                                         ; preds = %if.end
106*9880d681SAndroid Build Coastguard Worker  %inc24 = add nsw i32 %i1, 2
107*9880d681SAndroid Build Coastguard Worker  %inc25 = add nsw i32 %i2, 2
108*9880d681SAndroid Build Coastguard Worker  %idxprom26 = sext i32 %inc24 to i64
109*9880d681SAndroid Build Coastguard Worker  %arrayidx27 = getelementptr inbounds i8, i8* %0, i64 %idxprom26
110*9880d681SAndroid Build Coastguard Worker  %5 = load i8, i8* %arrayidx27, align 1
111*9880d681SAndroid Build Coastguard Worker  %idxprom28 = sext i32 %inc25 to i64
112*9880d681SAndroid Build Coastguard Worker  %arrayidx29 = getelementptr inbounds i8, i8* %0, i64 %idxprom28
113*9880d681SAndroid Build Coastguard Worker  %6 = load i8, i8* %arrayidx29, align 1
114*9880d681SAndroid Build Coastguard Worker  %cmp32 = icmp eq i8 %5, %6
115*9880d681SAndroid Build Coastguard Worker  br i1 %cmp32, label %return, label %if.then34
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerif.then34:                                        ; preds = %if.end23
118*9880d681SAndroid Build Coastguard Worker  %cmp37 = icmp ugt i8 %5, %6
119*9880d681SAndroid Build Coastguard Worker  %conv38 = zext i1 %cmp37 to i32
120*9880d681SAndroid Build Coastguard Worker  br label %return
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end23, %if.then34, %if.then18, %if.then
123*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ %conv8, %if.then ], [ %conv22, %if.then18 ], [ %conv38, %if.then34 ], [ 1, %if.end23 ]
124*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker; CHECK: @test
128*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: , uxtw #2]
129*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i32* %array, i8 zeroext %c, i32 %arg) {
130*9880d681SAndroid Build Coastguard Workerentry:
131*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %c to i32
132*9880d681SAndroid Build Coastguard Worker  %add = sub i32 0, %arg
133*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %conv, %add
134*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.end, label %if.then
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
137*9880d681SAndroid Build Coastguard Worker  %idxprom = zext i8 %c to i64
138*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %array, i64 %idxprom
139*9880d681SAndroid Build Coastguard Worker  %0 = load volatile i32, i32* %arrayidx, align 4
140*9880d681SAndroid Build Coastguard Worker  %1 = load volatile i32, i32* %arrayidx, align 4
141*9880d681SAndroid Build Coastguard Worker  %add3 = add nsw i32 %1, %0
142*9880d681SAndroid Build Coastguard Worker  br label %if.end
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry, %if.then
145*9880d681SAndroid Build Coastguard Worker  %res.0 = phi i32 [ %add3, %if.then ], [ 0, %entry ]
146*9880d681SAndroid Build Coastguard Worker  ret i32 %res.0
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; CHECK: @test2
151*9880d681SAndroid Build Coastguard Worker; CHECK: , uxtw #2]
152*9880d681SAndroid Build Coastguard Worker; CHECK: , uxtw #2]
153*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32* %array, i8 zeroext %c, i32 %arg) optsize {
154*9880d681SAndroid Build Coastguard Workerentry:
155*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %c to i32
156*9880d681SAndroid Build Coastguard Worker  %add = sub i32 0, %arg
157*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %conv, %add
158*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.end, label %if.then
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
161*9880d681SAndroid Build Coastguard Worker  %idxprom = zext i8 %c to i64
162*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %array, i64 %idxprom
163*9880d681SAndroid Build Coastguard Worker  %0 = load volatile i32, i32* %arrayidx, align 4
164*9880d681SAndroid Build Coastguard Worker  %1 = load volatile i32, i32* %arrayidx, align 4
165*9880d681SAndroid Build Coastguard Worker  %add3 = add nsw i32 %1, %0
166*9880d681SAndroid Build Coastguard Worker  br label %if.end
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry, %if.then
169*9880d681SAndroid Build Coastguard Worker  %res.0 = phi i32 [ %add3, %if.then ], [ 0, %entry ]
170*9880d681SAndroid Build Coastguard Worker  ret i32 %res.0
171*9880d681SAndroid Build Coastguard Worker}
172