Skip to content

Commit 748e355

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:2ac6b268dacd into amd-gfx:dff5a834339b
Local branch amd-gfx dff5a83 Merged main:12563ea6403f into amd-gfx:fe4b2144a23b Remote branch main 2ac6b26 [llvm][Transforms][Utils] Remove no-op ptr-to-ptr bitcasts (NFC)
2 parents dff5a83 + 2ac6b26 commit 748e355

File tree

27 files changed

+499
-141
lines changed

27 files changed

+499
-141
lines changed

clang/lib/CodeGen/CGDecl.cpp

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,29 +1244,24 @@ static void emitStoresForConstant(CodeGenModule &CGM, const VarDecl &D,
12441244
// If the initializer is small, use a handful of stores.
12451245
if (shouldSplitConstantStore(CGM, ConstantSize)) {
12461246
if (auto *STy = dyn_cast<llvm::StructType>(Ty)) {
1247-
// FIXME: handle the case when STy != Loc.getElementType().
1248-
if (STy == Loc.getElementType()) {
1249-
for (unsigned i = 0; i != constant->getNumOperands(); i++) {
1250-
Address EltPtr = Builder.CreateStructGEP(Loc, i);
1251-
emitStoresForConstant(
1252-
CGM, D, EltPtr, isVolatile, Builder,
1253-
cast<llvm::Constant>(Builder.CreateExtractValue(constant, i)),
1254-
IsAutoInit);
1255-
}
1256-
return;
1247+
const llvm::StructLayout *Layout =
1248+
CGM.getDataLayout().getStructLayout(STy);
1249+
for (unsigned i = 0; i != constant->getNumOperands(); i++) {
1250+
CharUnits CurOff = CharUnits::fromQuantity(Layout->getElementOffset(i));
1251+
Address EltPtr = Builder.CreateConstInBoundsByteGEP(
1252+
Loc.withElementType(CGM.Int8Ty), CurOff);
1253+
emitStoresForConstant(CGM, D, EltPtr, isVolatile, Builder,
1254+
constant->getAggregateElement(i), IsAutoInit);
12571255
}
1256+
return;
12581257
} else if (auto *ATy = dyn_cast<llvm::ArrayType>(Ty)) {
1259-
// FIXME: handle the case when ATy != Loc.getElementType().
1260-
if (ATy == Loc.getElementType()) {
1261-
for (unsigned i = 0; i != ATy->getNumElements(); i++) {
1262-
Address EltPtr = Builder.CreateConstArrayGEP(Loc, i);
1263-
emitStoresForConstant(
1264-
CGM, D, EltPtr, isVolatile, Builder,
1265-
cast<llvm::Constant>(Builder.CreateExtractValue(constant, i)),
1266-
IsAutoInit);
1267-
}
1268-
return;
1258+
for (unsigned i = 0; i != ATy->getNumElements(); i++) {
1259+
Address EltPtr = Builder.CreateConstGEP(
1260+
Loc.withElementType(ATy->getElementType()), i);
1261+
emitStoresForConstant(CGM, D, EltPtr, isVolatile, Builder,
1262+
constant->getAggregateElement(i), IsAutoInit);
12691263
}
1264+
return;
12701265
}
12711266
}
12721267

clang/lib/Headers/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ set(ppc_htm_files
116116
)
117117

118118
set(riscv_files
119+
riscv_bitmanip.h
120+
riscv_crypto.h
119121
riscv_ntlh.h
120122
sifive_vector.h
121123
)

clang/lib/Headers/riscv_bitmanip.h

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
/*===---- riscv_bitmanip.h - RISC-V Zb* intrinsics --------------------------===
2+
*
3+
* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
* See https://llvm.org/LICENSE.txt for license information.
5+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
*
7+
*===-----------------------------------------------------------------------===
8+
*/
9+
10+
#ifndef __RISCV_BITMANIP_H
11+
#define __RISCV_BITMANIP_H
12+
13+
#include <stdint.h>
14+
15+
#if defined(__cplusplus)
16+
extern "C" {
17+
#endif
18+
19+
#if defined(__riscv_zbb)
20+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
21+
__riscv_orc_b_32(uint32_t __x) {
22+
return __builtin_riscv_orc_b_32(__x);
23+
}
24+
25+
static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
26+
__riscv_clz_32(uint32_t __x) {
27+
return __builtin_riscv_clz_32(__x);
28+
}
29+
30+
static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
31+
__riscv_ctz_32(uint32_t __x) {
32+
return __builtin_riscv_ctz_32(__x);
33+
}
34+
35+
static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
36+
__riscv_cpop_32(uint32_t __x) {
37+
return __builtin_riscv_cpop_32(__x);
38+
}
39+
40+
#if __riscv_xlen == 64
41+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
42+
__riscv_orc_b_64(uint64_t __x) {
43+
return __builtin_riscv_orc_b_64(__x);
44+
}
45+
46+
static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
47+
__riscv_clz_64(uint64_t __x) {
48+
return __builtin_riscv_clz_64(__x);
49+
}
50+
51+
static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
52+
__riscv_ctz_64(uint64_t __x) {
53+
return __builtin_riscv_ctz_64(__x);
54+
}
55+
56+
static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
57+
__riscv_cpop_64(uint64_t __x) {
58+
return __builtin_riscv_cpop_64(__x);
59+
}
60+
#endif
61+
#endif // defined(__riscv_zbb)
62+
63+
#if defined(__riscv_zbb) || defined(__riscv_zbkb)
64+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
65+
__riscv_rev8_32(uint32_t __x) {
66+
return __builtin_bswap32(__x);
67+
}
68+
69+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
70+
__riscv_rol_32(uint32_t __x, uint32_t __y) {
71+
return __builtin_rotateleft32(__x, __y);
72+
}
73+
74+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
75+
__riscv_ror_32(uint32_t __x, uint32_t __y) {
76+
return __builtin_rotateright32(__x, __y);
77+
}
78+
79+
#if __riscv_xlen == 64
80+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
81+
__riscv_rev8_64(uint64_t __x) {
82+
return __builtin_bswap64(__x);
83+
}
84+
85+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
86+
__riscv_rol_64(uint64_t __x, uint32_t __y) {
87+
return __builtin_rotateleft64(__x, __y);
88+
}
89+
90+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
91+
__riscv_ror_64(uint64_t __x, uint32_t __y) {
92+
return __builtin_rotateright64(__x, __y);
93+
}
94+
#endif
95+
#endif // defined(__riscv_zbb) || defined(__riscv_zbkb)
96+
97+
#if defined(__riscv_zbkb)
98+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
99+
__riscv_brev8_32(uint32_t __x) {
100+
return __builtin_riscv_brev8_32(__x);
101+
}
102+
103+
#if __riscv_xlen == 64
104+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
105+
__riscv_brev8_64(uint64_t __x) {
106+
return __builtin_riscv_brev8_64(__x);
107+
}
108+
#endif
109+
110+
#if __riscv_xlen == 32
111+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
112+
__riscv_unzip_32(uint32_t __x) {
113+
return __builtin_riscv_unzip_32(__x);
114+
}
115+
116+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
117+
__riscv_zip_32(uint32_t __x) {
118+
return __builtin_riscv_zip_32(__x);
119+
}
120+
#endif
121+
#endif // defined(__riscv_zbkb)
122+
123+
#if defined(__riscv_zbkc)
124+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
125+
__riscv_clmul_32(uint32_t __x, uint32_t __y) {
126+
return __builtin_riscv_clmul_32(__x, __y);
127+
}
128+
129+
#if __riscv_xlen == 32
130+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
131+
__riscv_clmulh_32(uint32_t __x, uint32_t __y) {
132+
return __builtin_riscv_clmulh_32(__x, __y);
133+
}
134+
#endif
135+
136+
#if __riscv_xlen == 64
137+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
138+
__riscv_clmul_64(uint64_t __x, uint64_t __y) {
139+
return __builtin_riscv_clmul_64(__x, __y);
140+
}
141+
142+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
143+
__riscv_clmulh_64(uint64_t __x, uint64_t __y) {
144+
return __builtin_riscv_clmulh_64(__x, __y);
145+
}
146+
#endif
147+
#endif // defined(__riscv_zbkc)
148+
149+
#if defined(__riscv_zbkx)
150+
#if __riscv_xlen == 32
151+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
152+
__riscv_xperm4_32(uint32_t __x, uint32_t __y) {
153+
return __builtin_riscv_xperm4_32(__x, __y);
154+
}
155+
156+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
157+
__riscv_xperm8_32(uint32_t __x, uint32_t __y) {
158+
return __builtin_riscv_xperm8_32(__x, __y);
159+
}
160+
#endif
161+
162+
#if __riscv_xlen == 64
163+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
164+
__riscv_xperm4_64(uint64_t __x, uint64_t __y) {
165+
return __builtin_riscv_xperm4_64(__x, __y);
166+
}
167+
168+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
169+
__riscv_xperm8_64(uint64_t __x, uint64_t __y) {
170+
return __builtin_riscv_xperm8_64(__x, __y);
171+
}
172+
#endif
173+
#endif // defined(__riscv_zbkx)
174+
175+
#if defined(__cplusplus)
176+
}
177+
#endif
178+
179+
#endif

0 commit comments

Comments
 (0)