Skip to content

Commit 26bbd33

Browse files
committed
c++ ish
1 parent 77ef735 commit 26bbd33

File tree

4 files changed

+223
-7
lines changed

4 files changed

+223
-7
lines changed

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5797,11 +5797,26 @@ LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) {
57975797
return EmitComplexAssignmentLValue(E);
57985798

57995799
case TEK_Aggregate:
5800+
// If the lang opt is HLSL and the LHS is a constant array
5801+
// then we are performing a copy assignment and call a special
5802+
// function because EmitAggExprToLValue emits to a temporary LValue
5803+
if (getLangOpts().HLSL && E->getLHS()->getType()->isConstantArrayType())
5804+
return EmitHLSLArrayAssignLValue(E);
5805+
58005806
return EmitAggExprToLValue(E);
58015807
}
58025808
llvm_unreachable("bad evaluation kind");
58035809
}
58045810

5811+
// This function implements trivial copy assignment for HLSL's
5812+
// assignable constant arrays.
5813+
LValue CodeGenFunction::EmitHLSLArrayAssignLValue(const BinaryOperator *E) {
5814+
LValue TrivialAssignmentRHS = EmitLValue(E->getRHS());
5815+
LValue LHS = EmitLValue(E->getLHS());
5816+
EmitAggregateAssign(LHS, TrivialAssignmentRHS, E->getLHS()->getType());
5817+
return LHS;
5818+
}
5819+
58055820
LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E,
58065821
llvm::CallBase **CallOrInvoke) {
58075822
RValue RV = EmitCallExpr(E, ReturnValueSlot(), CallOrInvoke);

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4296,6 +4296,7 @@ class CodeGenFunction : public CodeGenTypeCache {
42964296
LValue EmitCastLValue(const CastExpr *E);
42974297
LValue EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E);
42984298
LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e);
4299+
LValue EmitHLSLArrayAssignLValue(const BinaryOperator *E);
42994300
void EmitHLSLOutArgExpr(const HLSLOutArgExpr *E, CallArgList &Args,
43004301
QualType Ty);
43014302

clang/test/AST/HLSL/ArrayAssignable.hlsl

Lines changed: 138 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,141 @@ void arr_assign3() {
7777
int Arr[2][2] = {{0, 1}, {2, 3}};
7878
int Arr2[2][2] = {{0, 0}, {1, 1}};
7979
Arr = Arr2;
80-
}
80+
}
81+
82+
// CHECK-LABEL: arr_assign4
83+
// CHECK: CompoundStmt 0x{{[0-9a-f]+}} {{.*}}
84+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
85+
// CHECK: VarDecl [[A:0x[0-9a-f]+]] {{.*}} col:7 used Arr 'int[2]' cinit
86+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
87+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
88+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 1
89+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
90+
// CHECK: VarDecl [[B:0x[0-9a-f]+]] {{.*}} col:7 used Arr2 'int[2]' cinit
91+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
92+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
93+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
94+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int' lvalue '='
95+
// CHECK: ArraySubscriptExpr 0x{{[0-9a-f]+}} {{.*}} 'int' lvalue
96+
// CHECK: ImplicitCastExpr 0x{{[0-9a-f]+}} {{.*}} 'int *' <ArrayToPointerDecay>
97+
// CHECK: ParenExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue
98+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue '='
99+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue Var [[A]] 'Arr' 'int[2]'
100+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue Var [[B]] 'Arr2' 'int[2]'
101+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
102+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 6
103+
void arr_assign4() {
104+
int Arr[2] = {0, 1};
105+
int Arr2[2] = {0, 0};
106+
(Arr = Arr2)[0] = 6;
107+
}
108+
109+
// CHECK-LABEL: arr_assign5
110+
// CHECK: CompoundStmt 0x{{[0-9a-f]+}} {{.*}}
111+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
112+
// CHECK: VarDecl [[A:0x[0-9a-f]+]] {{.*}} col:7 used Arr 'int[2]' cinit
113+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
114+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
115+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 1
116+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
117+
// CHECK: VarDecl [[B:0x[0-9a-f]+]] {{.*}} col:7 used Arr2 'int[2]' cinit
118+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
119+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
120+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
121+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
122+
// CHECK: VarDecl [[C:0x[0-9a-f]+]] {{.*}} col:7 used Arr3 'int[2]' cinit
123+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
124+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 3
125+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 4
126+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int' lvalue '='
127+
// CHECK: ArraySubscriptExpr 0x{{[0-9a-f]+}} {{.*}} 'int' lvalue
128+
// CHECK: ImplicitCastExpr 0x{{[0-9a-f]+}} {{.*}} 'int *' <ArrayToPointerDecay>
129+
// CHECK: ParenExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue
130+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue '='
131+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue Var [[A]] 'Arr' 'int[2]'
132+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue '='
133+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue Var [[B]] 'Arr2' 'int[2]'
134+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue Var [[C]] 'Arr3' 'int[2]'
135+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
136+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 6
137+
void arr_assign5() {
138+
int Arr[2] = {0, 1};
139+
int Arr2[2] = {0, 0};
140+
int Arr3[2] = {3, 4};
141+
(Arr = Arr2 = Arr3)[0] = 6;
142+
}
143+
144+
// CHECK-LABEL: arr_assign6
145+
// CHECK: CompoundStmt 0x{{[0-9a-f]+}} {{.*}}
146+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
147+
// CHECK: VarDecl [[A:0x[0-9a-f]+]] {{.*}} col:7 used Arr 'int[2][2]' cinit
148+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]'
149+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
150+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
151+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 1
152+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
153+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 2
154+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 3
155+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
156+
// CHECK: VarDecl [[B:0x[0-9a-f]+]] {{.*}} col:7 used Arr2 'int[2][2]' cinit
157+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]'
158+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
159+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
160+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
161+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
162+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 1
163+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 1
164+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int' lvalue '='
165+
// CHECK: ArraySubscriptExpr 0x{{[0-9a-f]+}} {{.*}} 'int' lvalue
166+
// CHECK: ImplicitCastExpr 0x{{[0-9a-f]+}} {{.*}} 'int *' <ArrayToPointerDecay>
167+
// CHECK: ArraySubscriptExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue
168+
// CHECK: ImplicitCastExpr 0x{{[0-9a-f]+}} {{.*}} 'int (*)[2]' <ArrayToPointerDecay>
169+
// CHECK: ParenExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]' lvalue
170+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]' lvalue '='
171+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]' lvalue Var [[A]] 'Arr' 'int[2][2]'
172+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]' lvalue Var [[B]] 'Arr2' 'int[2][2]'
173+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
174+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
175+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 6
176+
void arr_assign6() {
177+
int Arr[2][2] = {{0, 1}, {2, 3}};
178+
int Arr2[2][2] = {{0, 0}, {1, 1}};
179+
(Arr = Arr2)[0][0] = 6;
180+
}
181+
182+
// CHECK-LABEL: arr_assign7
183+
// CHECK: CompoundStmt 0x{{[0-9a-f]+}} {{.*}}
184+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
185+
// CHECK: VarDecl [[A:0x[0-9a-f]+]] {{.*}} col:7 used Arr 'int[2][2]' cinit
186+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]'
187+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
188+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
189+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 1
190+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
191+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 2
192+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 3
193+
// CHECK: DeclStmt 0x{{[0-9a-f]+}} {{.*}}
194+
// CHECK: VarDecl [[B:0x[0-9a-f]+]] {{.*}} col:7 used Arr2 'int[2][2]' cinit
195+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]'
196+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
197+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
198+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
199+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
200+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 1
201+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 1
202+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue '='
203+
// CHECK: ArraySubscriptExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]' lvalue
204+
// CHECK: ImplicitCastExpr 0x{{[0-9a-f]+}} {{.*}} 'int (*)[2]' <ArrayToPointerDecay>
205+
// CHECK: ParenExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]' lvalue
206+
// CHECK: BinaryOperator 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]' lvalue '='
207+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]' lvalue Var [[A]] 'Arr' 'int[2][2]'
208+
// CHECK: DeclRefExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2][2]' lvalue Var [[B]] 'Arr2' 'int[2][2]'
209+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 0
210+
// CHECK: InitListExpr 0x{{[0-9a-f]+}} {{.*}} 'int[2]'
211+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 6
212+
// CHECK: IntegerLiteral 0x{{[0-9a-f]+}} {{.*}} 'int' 6
213+
void arr_assign7() {
214+
int Arr[2][2] = {{0, 1}, {2, 3}};
215+
int Arr2[2][2] = {{0, 0}, {1, 1}};
216+
(Arr = Arr2)[0] = {6, 6};
217+
}

clang/test/CodeGenHLSL/ArrayAssignable.hlsl

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
// CHECK-LABEL: define void {{.*}}arr_assign1
44
// CHECK: [[Arr:%.*]] = alloca [2 x i32], align 4
55
// CHECK: [[Arr2:%.*]] = alloca [2 x i32], align 4
6-
// CHECK: [[Tmp:%.*]] = alloca [2 x i32], align 4
76
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr]], ptr align 4 {{@.*}}, i32 8, i1 false)
87
// CHECK: call void @llvm.memset.p0.i32(ptr align 4 [[Arr2]], i8 0, i32 8, i1 false)
98
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr]], ptr align 4 [[Arr2]], i32 8, i1 false)
10-
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Tmp]], ptr align 4 [[Arr]], i32 8, i1 false)
119
// CHECK: ret void
1210
void arr_assign1() {
1311
int Arr[2] = {0, 1};
@@ -19,13 +17,11 @@ void arr_assign1() {
1917
// CHECK: [[Arr:%.*]] = alloca [2 x i32], align 4
2018
// CHECK: [[Arr2:%.*]] = alloca [2 x i32], align 4
2119
// CHECK: [[Arr3:%.*]] = alloca [2 x i32], align 4
22-
// CHECK: [[Tmp:%.*]] = alloca [2 x i32], align 4
2320
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr]], ptr align 4 {{@.*}}, i32 8, i1 false)
2421
// CHECK: call void @llvm.memset.p0.i32(ptr align 4 [[Arr2]], i8 0, i32 8, i1 false)
2522
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr3]], ptr align 4 {{@.*}}, i32 8, i1 false)
2623
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr2]], ptr align 4 [[Arr3]], i32 8, i1 false)
2724
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr]], ptr align 4 [[Arr2]], i32 8, i1 false)
28-
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Tmp]], ptr align 4 [[Arr]], i32 8, i1 false)
2925
// CHECK: ret void
3026
void arr_assign2() {
3127
int Arr[2] = {0, 1};
@@ -37,14 +33,81 @@ void arr_assign2() {
3733
// CHECK-LABEL: define void {{.*}}arr_assign3
3834
// CHECK: [[Arr3:%.*]] = alloca [2 x [2 x i32]], align 4
3935
// CHECK: [[Arr4:%.*]] = alloca [2 x [2 x i32]], align 4
40-
// CHECK: [[Tmp:%.*]] = alloca [2 x [2 x i32]], align 4
4136
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr3]], ptr align 4 {{@.*}}, i32 16, i1 false)
4237
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr4]], ptr align 4 {{@.*}}, i32 16, i1 false)
4338
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr3]], ptr align 4 [[Arr4]], i32 16, i1 false)
44-
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Tmp]], ptr align 4 [[Arr3]], i32 16, i1 false)
4539
// CHECK: ret void
4640
void arr_assign3() {
4741
int Arr2[2][2] = {{0, 0}, {1, 1}};
4842
int Arr3[2][2] = {{1, 1}, {0, 0}};
4943
Arr2 = Arr3;
5044
}
45+
46+
// CHECK-LABEL: define void {{.*}}arr_assign4
47+
// CHECK: [[Arr:%.*]] = alloca [2 x i32], align 4
48+
// CHECK: [[Arr2:%.*]] = alloca [2 x i32], align 4
49+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr]], ptr align 4 {{@.*}}, i32 8, i1 false)
50+
// CHECK: call void @llvm.memset.p0.i32(ptr align 4 [[Arr2]], i8 0, i32 8, i1 false)
51+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr]], ptr align 4 [[Arr2]], i32 8, i1 false)
52+
// CHECK: [[Idx:%.*]] = getelementptr inbounds [2 x i32], ptr [[Arr]], i32 0, i32 0
53+
// CHECK: store i32 6, ptr [[Idx]], align 4
54+
// CHECK: ret void
55+
void arr_assign4() {
56+
int Arr[2] = {0, 1};
57+
int Arr2[2] = {0, 0};
58+
(Arr = Arr2)[0] = 6;
59+
}
60+
61+
// CHECK-LABEL: define void {{.*}}arr_assign5
62+
// CHECK: [[Arr:%.*]] = alloca [2 x i32], align 4
63+
// CHECK: [[Arr2:%.*]] = alloca [2 x i32], align 4
64+
// CHECK: [[Arr3:%.*]] = alloca [2 x i32], align 4
65+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr]], ptr align 4 {{@.*}}, i32 8, i1 false)
66+
// CHECK: call void @llvm.memset.p0.i32(ptr align 4 [[Arr2]], i8 0, i32 8, i1 false)
67+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr3]], ptr align 4 {{@.*}}, i32 8, i1 false)
68+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr2]], ptr align 4 [[Arr3]], i32 8, i1 false)
69+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr]], ptr align 4 [[Arr2]], i32 8, i1 false)
70+
// CHECK: [[Idx:%.*]] = getelementptr inbounds [2 x i32], ptr [[Arr]], i32 0, i32 0
71+
// CHECK: store i32 6, ptr [[Idx]], align 4
72+
// CHECK: ret void
73+
void arr_assign5() {
74+
int Arr[2] = {0, 1};
75+
int Arr2[2] = {0, 0};
76+
int Arr3[2] = {3, 4};
77+
(Arr = Arr2 = Arr3)[0] = 6;
78+
}
79+
80+
// CHECK-LABEL: define void {{.*}}arr_assign6
81+
// CHECK: [[Arr3:%.*]] = alloca [2 x [2 x i32]], align 4
82+
// CHECK: [[Arr4:%.*]] = alloca [2 x [2 x i32]], align 4
83+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr3]], ptr align 4 {{@.*}}, i32 16, i1 false)
84+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr4]], ptr align 4 {{@.*}}, i32 16, i1 false)
85+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr3]], ptr align 4 [[Arr4]], i32 16, i1 false)
86+
// CHECK: [[Idx:%.*]] = getelementptr inbounds [2 x [2 x i32]], ptr [[Arr3]], i32 0, i32 0
87+
// CHECK: [[Idx2:%.*]] = getelementptr inbounds [2 x i32], ptr [[Idx]], i32 0, i32 0
88+
// CHECK: store i32 6, ptr [[Idx2]], align 4
89+
// CHECK: ret void
90+
void arr_assign6() {
91+
int Arr[2][2] = {{0, 0}, {1, 1}};
92+
int Arr2[2][2] = {{1, 1}, {0, 0}};
93+
(Arr = Arr2)[0][0] = 6;
94+
}
95+
96+
// CHECK-LABEL: define void {{.*}}arr_assign7
97+
// CHECK: [[Arr3:%.*]] = alloca [2 x [2 x i32]], align 4
98+
// CHECK: [[Arr4:%.*]] = alloca [2 x [2 x i32]], align 4
99+
// CHECK: [[Tmp:%.*]] = alloca [2 x i32], align 4
100+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr3]], ptr align 4 {{@.*}}, i32 16, i1 false)
101+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr4]], ptr align 4 {{@.*}}, i32 16, i1 false)
102+
// CHECK: store i32 6, ptr [[Tmp]], align 4
103+
// CHECK: [[AIE:%.*]] = getelementptr inbounds i32, ptr [[Tmp]], i32 1
104+
// CHECK: store i32 6, ptr [[AIE]], align 4
105+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Arr3]], ptr align 4 [[Arr4]], i32 16, i1 false)
106+
// CHECK: [[Idx:%.*]] = getelementptr inbounds [2 x [2 x i32]], ptr [[Arr3]], i32 0, i32 0
107+
// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Idx]], ptr align 4 [[Tmp]], i32 8, i1 false)
108+
// CHECK: ret void
109+
void arr_assign7() {
110+
int Arr[2][2] = {{0, 1}, {2, 3}};
111+
int Arr2[2][2] = {{0, 0}, {1, 1}};
112+
(Arr = Arr2)[0] = {6, 6};
113+
}

0 commit comments

Comments
 (0)