Skip to content

Commit 62e7e8d

Browse files
authored
[CIR] Upstream UnaryExtension for Scalar Expr (llvm#160997)
Upstream UnaryExtension for Scalar Expr
1 parent 74aa2b7 commit 62e7e8d

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,10 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
676676
mlir::Value VisitRealImag(const UnaryOperator *e,
677677
QualType promotionType = QualType());
678678

679+
mlir::Value VisitUnaryExtension(const UnaryOperator *e) {
680+
return Visit(e->getSubExpr());
681+
}
682+
679683
mlir::Value VisitCXXDefaultInitExpr(CXXDefaultInitExpr *die) {
680684
CIRGenFunction::CXXDefaultInitExprScope scope(cgf, die);
681685
return Visit(die->getExpr());

clang/test/CIR/CodeGen/vector-ext.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,3 +1322,23 @@ void logical_not() {
13221322
// OGCG: %[[RESULT:.*]] = icmp eq <4 x i32> %[[TMP_A]], zeroinitializer
13231323
// OGCG: %[[RESULT_VI4:.*]] = sext <4 x i1> %[[RESULT]] to <4 x i32>
13241324
// OGCG: store <4 x i32> %[[RESULT_VI4]], ptr %[[B_ADDR]], align 16
1325+
1326+
void unary_extension() {
1327+
vi4 a;
1328+
vi4 b = __extension__ a;
1329+
}
1330+
1331+
// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]
1332+
// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]
1333+
// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
1334+
// CIR: cir.store{{.*}} %[[TMP_A]], %[[B_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
1335+
1336+
// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 16
1337+
// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 16
1338+
// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16
1339+
// LLVM: store <4 x i32> %[[TMP_A]], ptr %[[B_ADDR]], align 16
1340+
1341+
// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 16
1342+
// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 16
1343+
// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16
1344+
// OGCG: store <4 x i32> %[[TMP_A]], ptr %[[B_ADDR]], align 16

clang/test/CIR/CodeGen/vector.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,3 +1390,23 @@ void logical_not_float() {
13901390
// OGCG: %[[RESULT:.*]] = fcmp oeq <4 x float> %[[TMP_A]], zeroinitializer
13911391
// OGCG: %[[RESULT_VI4:.*]] = sext <4 x i1> %[[RESULT]] to <4 x i32>
13921392
// OGCG: store <4 x i32> %[[RESULT_VI4]], ptr %[[B_ADDR]], align 16
1393+
1394+
void unary_extension() {
1395+
vi4 a;
1396+
vi4 b = __extension__ a;
1397+
}
1398+
1399+
// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]
1400+
// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]
1401+
// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
1402+
// CIR: cir.store{{.*}} %[[TMP_A]], %[[B_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
1403+
1404+
// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 16
1405+
// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 16
1406+
// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16
1407+
// LLVM: store <4 x i32> %[[TMP_A]], ptr %[[B_ADDR]], align 16
1408+
1409+
// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 16
1410+
// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 16
1411+
// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 16
1412+
// OGCG: store <4 x i32> %[[TMP_A]], ptr %[[B_ADDR]], align 16

0 commit comments

Comments
 (0)