xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-fast-isel.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -fast-isel-abort=1 -verify-machineinstrs -mtriple=arm64-apple-darwin < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine void @t0(i32 %a) nounwind {
4*9880d681SAndroid Build Coastguard Workerentry:
5*9880d681SAndroid Build Coastguard Worker; CHECK: t0
6*9880d681SAndroid Build Coastguard Worker; CHECK: str {{w[0-9]+}}, [sp, #12]
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[REGISTER:w[0-9]+]], [sp, #12]
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[REGISTER]], [sp, #12]
9*9880d681SAndroid Build Coastguard Worker; CHECK: ret
10*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca i32, align 4
11*9880d681SAndroid Build Coastguard Worker  store i32 %a, i32* %a.addr
12*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %a.addr
13*9880d681SAndroid Build Coastguard Worker  store i32 %tmp, i32* %a.addr
14*9880d681SAndroid Build Coastguard Worker  ret void
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine void @t1(i64 %a) nounwind {
18*9880d681SAndroid Build Coastguard Worker; CHECK: t1
19*9880d681SAndroid Build Coastguard Worker; CHECK: str {{x[0-9]+}}, [sp, #8]
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[REGISTER:x[0-9]+]], [sp, #8]
21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[REGISTER]], [sp, #8]
22*9880d681SAndroid Build Coastguard Worker; CHECK: ret
23*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca i64, align 4
24*9880d681SAndroid Build Coastguard Worker  store i64 %a, i64* %a.addr
25*9880d681SAndroid Build Coastguard Worker  %tmp = load i64, i64* %a.addr
26*9880d681SAndroid Build Coastguard Worker  store i64 %tmp, i64* %a.addr
27*9880d681SAndroid Build Coastguard Worker  ret void
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @i1(i1 %a) nounwind {
31*9880d681SAndroid Build Coastguard Workerentry:
32*9880d681SAndroid Build Coastguard Worker; CHECK: @i1
33*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, w0, #0x1
34*9880d681SAndroid Build Coastguard Worker; CHECK: strb w0, [sp, #15]
35*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb w0, [sp, #15]
36*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, w0, #0x1
37*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, w0, #0x1
38*9880d681SAndroid Build Coastguard Worker; CHECK: add sp, sp, #16
39*9880d681SAndroid Build Coastguard Worker; CHECK: ret
40*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca i1, align 1
41*9880d681SAndroid Build Coastguard Worker  store i1 %a, i1* %a.addr, align 1
42*9880d681SAndroid Build Coastguard Worker  %0 = load i1, i1* %a.addr, align 1
43*9880d681SAndroid Build Coastguard Worker  ret i1 %0
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine i32 @t2(i32 *%ptr) nounwind {
47*9880d681SAndroid Build Coastguard Workerentry:
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2:
49*9880d681SAndroid Build Coastguard Worker; CHECK: ldur w0, [x0, #-4]
50*9880d681SAndroid Build Coastguard Worker; CHECK: ret
51*9880d681SAndroid Build Coastguard Worker  %0 = getelementptr i32, i32 *%ptr, i32 -1
52*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %0, align 4
53*9880d681SAndroid Build Coastguard Worker  ret i32 %1
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine i32 @t3(i32 *%ptr) nounwind {
57*9880d681SAndroid Build Coastguard Workerentry:
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3:
59*9880d681SAndroid Build Coastguard Worker; CHECK: ldur w0, [x0, #-256]
60*9880d681SAndroid Build Coastguard Worker; CHECK: ret
61*9880d681SAndroid Build Coastguard Worker  %0 = getelementptr i32, i32 *%ptr, i32 -64
62*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %0, align 4
63*9880d681SAndroid Build Coastguard Worker  ret i32 %1
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerdefine void @t4(i32 *%ptr) nounwind {
67*9880d681SAndroid Build Coastguard Workerentry:
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4:
69*9880d681SAndroid Build Coastguard Worker; CHECK: stur wzr, [x0, #-4]
70*9880d681SAndroid Build Coastguard Worker; CHECK: ret
71*9880d681SAndroid Build Coastguard Worker  %0 = getelementptr i32, i32 *%ptr, i32 -1
72*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %0, align 4
73*9880d681SAndroid Build Coastguard Worker  ret void
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerdefine void @t5(i32 *%ptr) nounwind {
77*9880d681SAndroid Build Coastguard Workerentry:
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5:
79*9880d681SAndroid Build Coastguard Worker; CHECK: stur wzr, [x0, #-256]
80*9880d681SAndroid Build Coastguard Worker; CHECK: ret
81*9880d681SAndroid Build Coastguard Worker  %0 = getelementptr i32, i32 *%ptr, i32 -64
82*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %0, align 4
83*9880d681SAndroid Build Coastguard Worker  ret void
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine void @t6() nounwind {
87*9880d681SAndroid Build Coastguard Worker; CHECK: t6
88*9880d681SAndroid Build Coastguard Worker; CHECK: brk #0x1
89*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.trap()
90*9880d681SAndroid Build Coastguard Worker  ret void
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.trap() nounwind
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine void @ands(i32* %addr) {
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ands:
97*9880d681SAndroid Build Coastguard Worker; CHECK: tst [[COND:w[0-9]+]], #0x1
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel [[COND]],
99*9880d681SAndroid Build Coastguard Workerentry:
100*9880d681SAndroid Build Coastguard Worker  %cond91 = select i1 undef, i32 1, i32 2
101*9880d681SAndroid Build Coastguard Worker  store i32 %cond91, i32* %addr, align 4
102*9880d681SAndroid Build Coastguard Worker  ret void
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine i64 @mul_umul(i64 %arg) {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mul_umul:
107*9880d681SAndroid Build Coastguard Worker; CHECK: mul x{{[0-9]+}}, [[ARG1:x[0-9]+]], [[ARG2:x[0-9]+]]
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: umulh x{{[0-9]+}}, [[ARG1]], [[ARG2]]
109*9880d681SAndroid Build Coastguard Workerentry:
110*9880d681SAndroid Build Coastguard Worker  %sub.ptr.div = sdiv exact i64 %arg, 8
111*9880d681SAndroid Build Coastguard Worker  %tmp = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %sub.ptr.div, i64 8)
112*9880d681SAndroid Build Coastguard Worker  %tmp1 = extractvalue { i64, i1 } %tmp, 0
113*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp1
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerdeclare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64)
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdefine void @logicalReg() {
119*9880d681SAndroid Build Coastguard Worker; Make sure we generate a logical reg = reg, reg instruction without any
120*9880d681SAndroid Build Coastguard Worker; machine verifier errors.
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: logicalReg:
122*9880d681SAndroid Build Coastguard Worker; CHECK: orr w{{[0-9]+}}, w{{[0-9]+}}, w{{[0-9]+}}
123*9880d681SAndroid Build Coastguard Worker; CHECK: ret
124*9880d681SAndroid Build Coastguard Workerentry:
125*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %cond.end, label %cond.false
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workercond.false:
128*9880d681SAndroid Build Coastguard Worker  %cond = select i1 undef, i1 true, i1 false
129*9880d681SAndroid Build Coastguard Worker  br label %cond.end
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workercond.end:
132*9880d681SAndroid Build Coastguard Worker  %cond13 = phi i1 [ %cond, %cond.false ], [ true, %entry ]
133*9880d681SAndroid Build Coastguard Worker  ret void
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136