Skip to content

Commit e6ab5ec

Browse files
seven-milelanza
authored andcommitted
[CIR][CIRGen] Fix compound assignment for vector types (#610)
There is [a code path](https://github.com/llvm/clangir/blob/3da10fafac66ff125fb59c602e41ad4b4f5cb382/clang/lib/CodeGen/CGExpr.cpp#L2190) missing the counterpart in CIRGen of vector types. When using compound assignments like `a[0] += a[1]`, this code path is activated and end up with NYI.
1 parent 07d8a7d commit e6ab5ec

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

clang/lib/CIR/CodeGen/CIRGenExpr.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,13 @@ RValue CIRGenFunction::buildLoadOfLValue(LValue LV, SourceLocation Loc) {
647647

648648
if (LV.isSimple())
649649
return RValue::get(buildLoadOfScalar(LV, Loc));
650+
651+
if (LV.isVectorElt()) {
652+
auto load = builder.createLoad(getLoc(Loc), LV.getVectorAddress());
653+
return RValue::get(builder.create<mlir::cir::VecExtractOp>(
654+
getLoc(Loc), load, LV.getVectorIdx()));
655+
}
656+
650657
llvm_unreachable("NYI");
651658
}
652659

clang/test/CIR/CodeGen/vectype.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ void vector_int_test(int x) {
4343
// CHECK: %[[#UPDATEDVI:]] = cir.vec.insert %{{[0-9]+}}, %[[#LOADEDVI]][%{{[0-9]+}} : !s32i] : !cir.vector<!s32i x 4>
4444
// CHECK: cir.store %[[#UPDATEDVI]], %[[#STORAGEVI]] : !cir.vector<!s32i x 4>, !cir.ptr<!cir.vector<!s32i x 4>>
4545

46+
// Compound assignment
47+
a[x] += a[0];
48+
// CHECK: %[[#LOADCA1:]] = cir.load %{{[0-9]+}} : !cir.ptr<!cir.vector<!s32i x 4>>, !cir.vector<!s32i x 4>
49+
// CHECK: %[[#RHSCA:]] = cir.vec.extract %[[#LOADCA1]][%{{[0-9]+}} : !s32i] : !cir.vector<!s32i x 4>
50+
// CHECK: %[[#LOADCAIDX2:]] = cir.load %{{[0-9]+}} : !cir.ptr<!s32i>, !s32i
51+
// CHECK: %[[#LOADCAVEC3:]] = cir.load %{{[0-9]+}} : !cir.ptr<!cir.vector<!s32i x 4>>, !cir.vector<!s32i x 4>
52+
// CHECK: %[[#LHSCA:]] = cir.vec.extract %[[#LOADCAVEC3]][%[[#LOADCAIDX2]] : !s32i] : !cir.vector<!s32i x 4>
53+
// CHECK: %[[#SUMCA:]] = cir.binop(add, %[[#LHSCA]], %[[#RHSCA]]) : !s32i
54+
// CHECK: %[[#LOADCAVEC4:]] = cir.load %{{[0-9]+}} : !cir.ptr<!cir.vector<!s32i x 4>>, !cir.vector<!s32i x 4>
55+
// CHECK: %[[#RESULTCAVEC:]] = cir.vec.insert %[[#SUMCA]], %[[#LOADCAVEC4]][%[[#LOADCAIDX2]] : !s32i] : !cir.vector<!s32i x 4>
56+
// CHECK: cir.store %[[#RESULTCAVEC]], %{{[0-9]+}} : !cir.vector<!s32i x 4>, !cir.ptr<!cir.vector<!s32i x 4>>
57+
4658
// Binary arithmetic operations
4759
vi4 d = a + b;
4860
// CHECK: %{{[0-9]+}} = cir.binop(add, %{{[0-9]+}}, %{{[0-9]+}}) : !cir.vector<!s32i x 4>

clang/test/CIR/Lowering/vectype.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,18 @@ void vector_int_test(int x) {
7575
// CHECK: %[[#T64:]] = llvm.insertelement %[[#T61]], %[[#T63]][%[[#T62]] : i32] : vector<4xi32>
7676
// CHECK: llvm.store %[[#T64]], %[[#T3]] : vector<4xi32>, !llvm.ptr
7777

78+
// Compound assignment
79+
a[x] += a[0];
80+
// CHECK: %[[#LOADCA1:]] = llvm.load %{{[0-9]+}} : !llvm.ptr -> vector<4xi32>
81+
// CHECK: %[[#RHSCA:]] = llvm.extractelement %[[#LOADCA1:]][%{{[0-9]+}} : i32] : vector<4xi32>
82+
// CHECK: %[[#LOADCAIDX2:]] = llvm.load %{{[0-9]+}} : !llvm.ptr -> i32
83+
// CHECK: %[[#LOADCAVEC3:]] = llvm.load %{{[0-9]+}} : !llvm.ptr -> vector<4xi32>
84+
// CHECK: %[[#LHSCA:]] = llvm.extractelement %[[#LOADCAVEC3:]][%[[#LOADCAIDX2:]] : i32] : vector<4xi32>
85+
// CHECK: %[[#SUMCA:]] = llvm.add %[[#LHSCA:]], %[[#RHSCA:]] : i32
86+
// CHECK: %[[#LOADCAVEC4:]] = llvm.load %{{[0-9]+}} : !llvm.ptr -> vector<4xi32>
87+
// CHECK: %[[#RESULTCAVEC:]] = llvm.insertelement %[[#SUMCA:]], %[[#LOADCAVEC4:]][%[[#LOADCAIDX2:]] : i32] : vector<4xi32>
88+
// CHECK: llvm.store %[[#RESULTCAVEC:]], %{{[0-9]+}} : vector<4xi32>, !llvm.ptr
89+
7890
// Binary arithmetic operators.
7991
vi4 d = a + b;
8092
// CHECK: %[[#T65:]] = llvm.load %[[#T3]] : !llvm.ptr -> vector<4xi32>

0 commit comments

Comments
 (0)