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
1210void 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
3026void 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
4640void 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