[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-fold-lshr.ll
blob9dfc8df703ce640559531f08b9cc0a6a16060e45
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc < %s -mtriple=aarch64 | FileCheck %s
5 define i16 @load16_shr63(i64 %a, i64 %b, ptr %table) {
6 ; CHECK-LABEL: load16_shr63:
7 ; CHECK:       // %bb.0: // %entry
8 ; CHECK-NEXT:    mul x8, x1, x0
9 ; CHECK-NEXT:    lsr x8, x8, #63
10 ; CHECK-NEXT:    ldrh w0, [x2, x8, lsl #1]
11 ; CHECK-NEXT:    ret
12 entry:
13   %mul = mul i64 %b, %a
14   %shr = lshr i64 %mul, 63
15   %arrayidx = getelementptr inbounds i16, ptr %table, i64 %shr
16   %0 = load i16, ptr %arrayidx, align 2
17   ret i16 %0
20 define i16 @load16_shr2(i64 %a, i64 %b, ptr %table) {
21 ; CHECK-LABEL: load16_shr2:
22 ; CHECK:       // %bb.0: // %entry
23 ; CHECK-NEXT:    mul x8, x1, x0
24 ; CHECK-NEXT:    lsr x8, x8, #2
25 ; CHECK-NEXT:    ldrh w0, [x2, x8, lsl #1]
26 ; CHECK-NEXT:    ret
27 entry:
28   %mul = mul i64 %b, %a
29   %shr = lshr i64 %mul, 2
30   %arrayidx = getelementptr inbounds i16, ptr %table, i64 %shr
31   %0 = load i16, ptr %arrayidx, align 2
32   ret i16 %0
35 define i16 @load16_shr1(i64 %a, i64 %b, ptr %table) {
36 ; CHECK-LABEL: load16_shr1:
37 ; CHECK:       // %bb.0: // %entry
38 ; CHECK-NEXT:    mul x8, x1, x0
39 ; CHECK-NEXT:    lsr x8, x8, #1
40 ; CHECK-NEXT:    ldrh w0, [x2, x8, lsl #1]
41 ; CHECK-NEXT:    ret
42 entry:
43   %mul = mul i64 %b, %a
44   %shr = lshr i64 %mul, 1
45   %arrayidx = getelementptr inbounds i16, ptr %table, i64 %shr
46   %0 = load i16, ptr %arrayidx, align 2
47   ret i16 %0
50 define i32 @load32_shr63(i64 %a, i64 %b, ptr %table) {
51 ; CHECK-LABEL: load32_shr63:
52 ; CHECK:       // %bb.0: // %entry
53 ; CHECK-NEXT:    mul x8, x1, x0
54 ; CHECK-NEXT:    lsr x8, x8, #63
55 ; CHECK-NEXT:    ldr w0, [x2, x8, lsl #2]
56 ; CHECK-NEXT:    ret
57 entry:
58   %mul = mul i64 %b, %a
59   %shr = lshr i64 %mul, 63
60   %arrayidx = getelementptr inbounds i32, ptr %table, i64 %shr
61   %0 = load i32, ptr %arrayidx, align 4
62   ret i32 %0
65 define i32 @load32_shr2(i64 %a, i64 %b, ptr %table) {
66 ; CHECK-LABEL: load32_shr2:
67 ; CHECK:       // %bb.0: // %entry
68 ; CHECK-NEXT:    mul x8, x1, x0
69 ; CHECK-NEXT:    lsr x8, x8, #2
70 ; CHECK-NEXT:    ldr w0, [x2, x8, lsl #2]
71 ; CHECK-NEXT:    ret
72 entry:
73   %mul = mul i64 %b, %a
74   %shr = lshr i64 %mul, 2
75   %arrayidx = getelementptr inbounds i32, ptr %table, i64 %shr
76   %0 = load i32, ptr %arrayidx, align 4
77   ret i32 %0
80 define i32 @load32_shr1(i64 %a, i64 %b, ptr %table) {
81 ; CHECK-LABEL: load32_shr1:
82 ; CHECK:       // %bb.0: // %entry
83 ; CHECK-NEXT:    mul x8, x1, x0
84 ; CHECK-NEXT:    lsr x8, x8, #1
85 ; CHECK-NEXT:    ldr w0, [x2, x8, lsl #2]
86 ; CHECK-NEXT:    ret
87 entry:
88   %mul = mul i64 %b, %a
89   %shr = lshr i64 %mul, 1
90   %arrayidx = getelementptr inbounds i32, ptr %table, i64 %shr
91   %0 = load i32, ptr %arrayidx, align 4
92   ret i32 %0
95 define i64 @load64_shr63(i64 %a, i64 %b, ptr %table) {
96 ; CHECK-LABEL: load64_shr63:
97 ; CHECK:       // %bb.0: // %entry
98 ; CHECK-NEXT:    mul x8, x1, x0
99 ; CHECK-NEXT:    lsr x8, x8, #63
100 ; CHECK-NEXT:    ldr x0, [x2, x8, lsl #3]
101 ; CHECK-NEXT:    ret
102 entry:
103   %mul = mul i64 %b, %a
104   %shr = lshr i64 %mul, 63
105   %arrayidx = getelementptr inbounds i64, ptr %table, i64 %shr
106   %0 = load i64, ptr %arrayidx, align 8
107   ret i64 %0
110 define i64 @load64_shr2(i64 %a, i64 %b, ptr %table) {
111 ; CHECK-LABEL: load64_shr2:
112 ; CHECK:       // %bb.0: // %entry
113 ; CHECK-NEXT:    mul x8, x1, x0
114 ; CHECK-NEXT:    lsr x8, x8, #2
115 ; CHECK-NEXT:    ldr x0, [x2, x8, lsl #3]
116 ; CHECK-NEXT:    ret
117 entry:
118   %mul = mul i64 %b, %a
119   %shr = lshr i64 %mul, 2
120   %arrayidx = getelementptr inbounds i64, ptr %table, i64 %shr
121   %0 = load i64, ptr %arrayidx, align 8
122   ret i64 %0
125 define i64 @load64_shr1(i64 %a, i64 %b, ptr %table) {
126 ; CHECK-LABEL: load64_shr1:
127 ; CHECK:       // %bb.0: // %entry
128 ; CHECK-NEXT:    mul x8, x1, x0
129 ; CHECK-NEXT:    lsr x8, x8, #1
130 ; CHECK-NEXT:    ldr x0, [x2, x8, lsl #3]
131 ; CHECK-NEXT:    ret
132 entry:
133   %mul = mul i64 %b, %a
134   %shr = lshr i64 %mul, 1
135   %arrayidx = getelementptr inbounds i64, ptr %table, i64 %shr
136   %0 = load i64, ptr %arrayidx, align 8
137   ret i64 %0