brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.5 KiB · dfd86a2 Raw
436 lines · plain
1; RUN: llc < %s -mtriple=armv7-apple-ios -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-IOS --check-prefix=CHECK2; RUN: llc < %s -mtriple=thumbv7m-none-macho -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-DARWIN --check-prefix=CHECK3; RUN: llc < %s -mtriple=arm-none-eabi -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-EABI --check-prefix=CHECK4; RUN: llc < %s -mtriple=arm-none-eabihf -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-EABI --check-prefix=CHECK5; RUN: llc < %s -mtriple=arm-none-androideabi -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-EABI --check-prefix=CHECK6; RUN: llc < %s -mtriple=arm-none-gnueabi -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-GNUEABI --check-prefix=CHECK7; RUN: llc < %s -mtriple=arm-none-gnueabihf -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-GNUEABI --check-prefix=CHECK8; RUN: llc < %s -mtriple=arm-none-musleabi -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-GNUEABI --check-prefix=CHECK9; RUN: llc < %s -mtriple=arm-none-musleabihf -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-GNUEABI --check-prefix=CHECK10 11define void @f1(ptr %dest, ptr %src) "frame-pointer"="all" {12entry:13  ; CHECK-LABEL: f114 15  ; CHECK-IOS: bl _memmove16  ; CHECK-DARWIN: bl _memmove17  ; CHECK-EABI: bl __aeabi_memmove18  ; CHECK-GNUEABI: bl memmove19  call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %src, i32 500, i1 false)20 21  ; CHECK-IOS: bl _memcpy22  ; CHECK-DARWIN: bl _memcpy23  ; CHECK-EABI: bl __aeabi_memcpy24  ; CHECK-GNUEABI: bl memcpy25  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %src, i32 500, i1 false)26 27  ; EABI memset swaps arguments28  ; CHECK-IOS: mov r1, #129  ; CHECK-IOS: bl _memset30  ; CHECK-DARWIN: movs r1, #131  ; CHECK-DARWIN: bl _memset32  ; CHECK-EABI: mov r2, #133  ; CHECK-EABI: bl __aeabi_memset34  ; CHECK-GNUEABI: mov r1, #135  ; CHECK-GNUEABI: bl memset36  call void @llvm.memset.p0.i32(ptr %dest, i8 1, i32 500, i1 false)37 38  ; EABI uses memclr if value set to 039  ; CHECK-IOS: mov r1, #040  ; CHECK-IOS: bl _memset41  ; CHECK-DARWIN: movs r1, #042  ; CHECK-DARWIN: bl _memset43  ; CHECK-EABI: bl __aeabi_memclr44  ; CHECK-GNUEABI: bl memset45  call void @llvm.memset.p0.i32(ptr %dest, i8 0, i32 500, i1 false)46 47  ; EABI uses aligned function variants if possible48 49  ; CHECK-IOS: bl _memmove50  ; CHECK-DARWIN: bl _memmove51  ; CHECK-EABI: bl __aeabi_memmove452  ; CHECK-GNUEABI: bl memmove53  call void @llvm.memmove.p0.p0.i32(ptr align 4 %dest, ptr align 4 %src, i32 500, i1 false)54 55  ; CHECK-IOS: bl _memcpy56  ; CHECK-DARWIN: bl _memcpy57  ; CHECK-EABI: bl __aeabi_memcpy458  ; CHECK-GNUEABI: bl memcpy59  call void @llvm.memcpy.p0.p0.i32(ptr align 4 %dest, ptr align 4 %src, i32 500, i1 false)60 61  ; CHECK-IOS: bl _memset62  ; CHECK-DARWIN: bl _memset63  ; CHECK-EABI: bl __aeabi_memset464  ; CHECK-GNUEABI: bl memset65  call void @llvm.memset.p0.i32(ptr align 4 %dest, i8 1, i32 500, i1 false)66 67  ; CHECK-IOS: bl _memset68  ; CHECK-DARWIN: bl _memset69  ; CHECK-EABI: bl __aeabi_memclr470  ; CHECK-GNUEABI: bl memset71  call void @llvm.memset.p0.i32(ptr align 4 %dest, i8 0, i32 500, i1 false)72 73  ; CHECK-IOS: bl _memmove74  ; CHECK-DARWIN: bl _memmove75  ; CHECK-EABI: bl __aeabi_memmove876  ; CHECK-GNUEABI: bl memmove77  call void @llvm.memmove.p0.p0.i32(ptr align 8 %dest, ptr align 8 %src, i32 500, i1 false)78 79  ; CHECK-IOS: bl _memcpy80  ; CHECK-DARWIN: bl _memcpy81  ; CHECK-EABI: bl __aeabi_memcpy882  ; CHECK-GNUEABI: bl memcpy83  call void @llvm.memcpy.p0.p0.i32(ptr align 8 %dest, ptr align 8 %src, i32 500, i1 false)84 85  ; CHECK-IOS: bl _memset86  ; CHECK-DARWIN: bl _memset87  ; CHECK-EABI: bl __aeabi_memset888  ; CHECK-GNUEABI: bl memset89  call void @llvm.memset.p0.i32(ptr align 8 %dest, i8 1, i32 500, i1 false)90 91  ; CHECK-IOS: bl _memset92  ; CHECK-DARWIN: bl _memset93  ; CHECK-EABI: bl __aeabi_memclr894  ; CHECK-GNUEABI: bl memset95  call void @llvm.memset.p0.i32(ptr align 8 %dest, i8 0, i32 500, i1 false)96 97  ret void98}99 100; Check that alloca arguments to memory intrinsics are automatically aligned if at least 8 bytes in size101define void @f2(ptr %dest, i32 %n) "frame-pointer"="all" {102entry:103  ; CHECK-LABEL: f2104 105  ; IOS (ARMv7) should 8-byte align, others should 4-byte align106  ; CHECK-IOS: add r1, sp, #32107  ; CHECK-IOS: bl _memmove108  ; CHECK-DARWIN: add r1, sp, #28109  ; CHECK-DARWIN: bl _memmove110  ; CHECK-EABI: {{add r1, sp, #28|sub r1, r(7|11), #20}}111  ; CHECK-EABI: bl __aeabi_memmove112  ; CHECK-GNUEABI: {{add r1, sp, #28|sub r1, r(7|11), #20}}113  ; CHECK-GNUEABI: bl memmove114  %arr0 = alloca [9 x i8], align 1115  call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %arr0, i32 %n, i1 false)116 117  ; CHECK: add r1, sp, #16118  ; CHECK-IOS: bl _memcpy119  ; CHECK-DARWIN: bl _memcpy120  ; CHECK-EABI: bl __aeabi_memcpy121  ; CHECK-GNUEABI: bl memcpy122  %arr1 = alloca [9 x i8], align 1123  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %arr1, i32 %n, i1 false)124 125  ; CHECK-IOS: mov r0, sp126  ; CHECK-IOS: mov r1, #1127  ; CHECK-IOS: bl _memset128  ; CHECK-DARWIN: add r0, sp, #4129  ; CHECK-DARWIN: movs r1, #1130  ; CHECK-DARWIN: bl _memset131  ; CHECK-EABI: add r0, sp, #4132  ; CHECK-EABI: mov r2, #1133  ; CHECK-EABI: bl __aeabi_memset134  ; CHECK-GNUEABI: add r0, sp, #4135  ; CHECK-GNUEABI: mov r1, #1136  ; CHECK-GNUEABI: bl memset137  %arr2 = alloca [9 x i8], align 1138  call void @llvm.memset.p0.i32(ptr %arr2, i8 1, i32 %n, i1 false)139 140  ret void141}142 143; Check that alloca arguments are not aligned if less than 8 bytes in size144define void @f3(ptr %dest, i32 %n) "frame-pointer"="all" {145entry:146  ; CHECK-LABEL: f3147 148  ; CHECK: {{add(.w)? r1, sp, #17|sub(.w)? r1, r(7|11), #15}}149  ; CHECK-IOS: bl _memmove150  ; CHECK-DARWIN: bl _memmove151  ; CHECK-EABI: bl __aeabi_memmove152  ; CHECK-GNUEABI: bl memmove153  %arr0 = alloca [7 x i8], align 1154  call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %arr0, i32 %n, i1 false)155 156  ; CHECK: {{add(.w)? r1, sp, #10|sub(.w)? r1, r(7|11), #22}}157  ; CHECK-IOS: bl _memcpy158  ; CHECK-DARWIN: bl _memcpy159  ; CHECK-EABI: bl __aeabi_memcpy160  ; CHECK-GNUEABI: bl memcpy161  %arr1 = alloca [7 x i8], align 1162  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %arr1, i32 %n, i1 false)163 164  ; CHECK: {{add(.w)? r0, sp, #3|sub(.w)? r0, r(7|11), #29}}165  ; CHECK-IOS: mov r1, #1166  ; CHECK-IOS: bl _memset167  ; CHECK-DARWIN: movs r1, #1168  ; CHECK-DARWIN: bl _memset169  ; CHECK-EABI: mov r2, #1170  ; CHECK-EABI: bl __aeabi_memset171  ; CHECK-GNUEABI: mov r1, #1172  ; CHECK-GNUEABI: bl memset173  %arr2 = alloca [7 x i8], align 1174  call void @llvm.memset.p0.i32(ptr %arr2, i8 1, i32 %n, i1 false)175 176  ret void177}178 179; Check that alloca arguments are not aligned if size+offset is less than 8 bytes180define void @f4(ptr %dest, i32 %n) "frame-pointer"="all" {181entry:182  ; CHECK-LABEL: f4183 184  ; CHECK: {{add(.w)? r., sp, #23|sub(.w)? r., r(7|11), #17}}185  ; CHECK-IOS: bl _memmove186  ; CHECK-DARWIN: bl _memmove187  ; CHECK-EABI: bl __aeabi_memmove188  ; CHECK-GNUEABI: bl memmove189  %arr0 = alloca [9 x i8], align 1190  %0 = getelementptr inbounds [9 x i8], ptr %arr0, i32 0, i32 4191  call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %0, i32 %n, i1 false)192 193  ; CHECK: {{add(.w)? r., sp, #(10|14)|sub(.w) r., r(7|11), #26}}194  ; CHECK-IOS: bl _memcpy195  ; CHECK-DARWIN: bl _memcpy196  ; CHECK-EABI: bl __aeabi_memcpy197  ; CHECK-GNUEABI: bl memcpy198  %arr1 = alloca [9 x i8], align 1199  %1 = getelementptr inbounds [9 x i8], ptr %arr1, i32 0, i32 4200  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %1, i32 %n, i1 false)201 202  ; CHECK: {{add(.w)? r., sp, #(1|5)|sub(.w) r., r(7|11), #35}}203  ; CHECK-IOS: mov r1, #1204  ; CHECK-IOS: bl _memset205  ; CHECK-DARWIN: movs r1, #1206  ; CHECK-DARWIN: bl _memset207  ; CHECK-EABI: mov r2, #1208  ; CHECK-EABI: bl __aeabi_memset209  ; CHECK-GNUEABI: mov r1, #1210  ; CHECK-GNUEABI: bl memset211  %arr2 = alloca [9 x i8], align 1212  %2 = getelementptr inbounds [9 x i8], ptr %arr2, i32 0, i32 4213  call void @llvm.memset.p0.i32(ptr %2, i8 1, i32 %n, i1 false)214 215  ret void216}217 218; Check that alloca arguments are not aligned if the offset is not a multiple of 4219define void @f5(ptr %dest, i32 %n) "frame-pointer"="all" {220entry:221  ; CHECK-LABEL: f5222 223  ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r(7|11), #21}}224  ; CHECK-IOS: bl _memmove225  ; CHECK-DARWIN: bl _memmove226  ; CHECK-EABI: bl __aeabi_memmove227  ; CHECK-GNUEABI: bl memmove228  %arr0 = alloca [13 x i8], align 1229  %0 = getelementptr inbounds [13 x i8], ptr %arr0, i32 0, i32 1230  call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %0, i32 %n, i1 false)231 232  ; CHECK: {{add(.w)? r., sp, #(10|14)|sub(.w)? r., r(7|11), #34}}233  ; CHECK-IOS: bl _memcpy234  ; CHECK-DARWIN: bl _memcpy235  ; CHECK-EABI: bl __aeabi_memcpy236  ; CHECK-GNUEABI: bl memcpy237  %arr1 = alloca [13 x i8], align 1238  %1 = getelementptr inbounds [13 x i8], ptr %arr1, i32 0, i32 1239  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %1, i32 %n, i1 false)240 241  ; CHECK: {{add(.w)? r., sp, #(1|5)|sub(.w)? r., r(7|11), #47}}242  ; CHECK-IOS: mov r1, #1243  ; CHECK-IOS: bl _memset244  ; CHECK-DARWIN: movs r1, #1245  ; CHECK-DARWIN: bl _memset246  ; CHECK-EABI: mov r2, #1247  ; CHECK-EABI: bl __aeabi_memset248  ; CHECK-GNUEABI: mov r1, #1249  ; CHECK-GNUEABI: bl memset250  %arr2 = alloca [13 x i8], align 1251  %2 = getelementptr inbounds [13 x i8], ptr %arr2, i32 0, i32 1252  call void @llvm.memset.p0.i32(ptr %2, i8 1, i32 %n, i1 false)253 254  ret void255}256 257; Check that alloca arguments are not aligned if the offset is unknown258define void @f6(ptr %dest, i32 %n, i32 %i) "frame-pointer"="all" {259entry:260  ; CHECK-LABEL: f6261 262  ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r(7|11), #(25|29)}}263  ; CHECK-IOS: bl _memmove264  ; CHECK-DARWIN: bl _memmove265  ; CHECK-EABI: bl __aeabi_memmove266  ; CHECK-GNUEABI: bl memmove267  %arr0 = alloca [13 x i8], align 1268  %0 = getelementptr inbounds [13 x i8], ptr %arr0, i32 0, i32 %i269  call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %0, i32 %n, i1 false)270 271  ; CHECK: {{add(.w)? r., sp, #(10|14)|sub(.w)? r., r(7|11), #42}}272  ; CHECK-IOS: bl _memcpy273  ; CHECK-DARWIN: bl _memcpy274  ; CHECK-EABI: bl __aeabi_memcpy275  ; CHECK-GNUEABI: bl memcpy276  %arr1 = alloca [13 x i8], align 1277  %1 = getelementptr inbounds [13 x i8], ptr %arr1, i32 0, i32 %i278  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %1, i32 %n, i1 false)279 280  ; CHECK: {{add(.w)? r., sp, #(1|5)|sub(.w)? r., r(7|11), #55}}281  ; CHECK-IOS: mov r1, #1282  ; CHECK-IOS: bl _memset283  ; CHECK-DARWIN: movs r1, #1284  ; CHECK-DARWIN: bl _memset285  ; CHECK-EABI: mov r2, #1286  ; CHECK-EABI: bl __aeabi_memset287  ; CHECK-GNUEABI: mov r1, #1288  ; CHECK-GNUEABI: bl memset289  %arr2 = alloca [13 x i8], align 1290  %2 = getelementptr inbounds [13 x i8], ptr %arr2, i32 0, i32 %i291  call void @llvm.memset.p0.i32(ptr %2, i8 1, i32 %n, i1 false)292 293  ret void294}295 296; Check that alloca arguments are not aligned if the GEP is not inbounds297define void @f7(ptr %dest, i32 %n) "frame-pointer"="all" {298entry:299  ; CHECK-LABEL: f7300 301  ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r(7|11), #21}}302  ; CHECK-IOS: bl _memmove303  ; CHECK-DARWIN: bl _memmove304  ; CHECK-EABI: bl __aeabi_memmove305  ; CHECK-GNUEABI: bl memmove306  %arr0 = alloca [13 x i8], align 1307  %0 = getelementptr [13 x i8], ptr %arr0, i32 0, i32 4308  call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %0, i32 %n, i1 false)309 310  ; CHECK: {{add(.w)? r., sp, #(10|14)|sub(.w)? r., r(7|11), #34}}311  ; CHECK-IOS: bl _memcpy312  ; CHECK-DARWIN: bl _memcpy313  ; CHECK-EABI: bl __aeabi_memcpy314  ; CHECK-GNUEABI: bl memcpy315  %arr1 = alloca [13 x i8], align 1316  %1 = getelementptr [13 x i8], ptr %arr1, i32 0, i32 4317  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %1, i32 %n, i1 false)318 319  ; CHECK: {{add(.w)? r., sp, #(1|5)|sub(.w)? r., r(7|11), #47}}320  ; CHECK-IOS: mov r1, #1321  ; CHECK-IOS: bl _memset322  ; CHECK-DARWIN: movs r1, #1323  ; CHECK-DARWIN: bl _memset324  ; CHECK-EABI: mov r2, #1325  ; CHECK-EABI: bl __aeabi_memset326  ; CHECK-GNUEABI: mov r1, #1327  ; CHECK-GNUEABI: bl memset328  %arr2 = alloca [13 x i8], align 1329  %2 = getelementptr [13 x i8], ptr %arr2, i32 0, i32 4330  call void @llvm.memset.p0.i32(ptr %2, i8 1, i32 %n, i1 false)331 332  ret void333}334 335; Check that alloca arguments are not aligned when the offset is past the end of the allocation336define void @f8(ptr %dest, i32 %n) "frame-pointer"="all" {337entry:338  ; CHECK-LABEL: f8339 340  ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r(7|11), #21}}341  ; CHECK-IOS: bl _memmove342  ; CHECK-DARWIN: bl _memmove343  ; CHECK-EABI: bl __aeabi_memmove344  ; CHECK-GNUEABI: bl memmove345  %arr0 = alloca [13 x i8], align 1346  %0 = getelementptr inbounds [13 x i8], ptr %arr0, i32 0, i32 16347  call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %0, i32 %n, i1 false)348 349  ; CHECK: {{add(.w)? r., sp, #(10|14)|sub(.w)? r., r(7|11), #34}}350  ; CHECK-IOS: bl _memcpy351  ; CHECK-DARWIN: bl _memcpy352  ; CHECK-EABI: bl __aeabi_memcpy353  ; CHECK-GNUEABI: bl memcpy354  %arr1 = alloca [13 x i8], align 1355  %1 = getelementptr inbounds [13 x i8], ptr %arr1, i32 0, i32 16356  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %1, i32 %n, i1 false)357 358  ; CHECK: {{add(.w)? r., sp, #(1|5)|sub(.w)? r., r(7|11), #47}}359  ; CHECK-IOS: mov r1, #1360  ; CHECK-IOS: bl _memset361  ; CHECK-DARWIN: movs r1, #1362  ; CHECK-DARWIN: bl _memset363  ; CHECK-EABI: mov r2, #1364  ; CHECK-EABI: bl __aeabi_memset365  ; CHECK-GNUEABI: mov r1, #1366  ; CHECK-GNUEABI: bl memset367  %arr2 = alloca [13 x i8], align 1368  %2 = getelementptr inbounds [13 x i8], ptr %arr2, i32 0, i32 16369  call void @llvm.memset.p0.i32(ptr %2, i8 1, i32 %n, i1 false)370 371  ret void372}373 374; Check that global variables are aligned if they are large enough, but only if375; they are defined in this object and don't have an explicit section.376@arr1 = global [7 x i8] c"\01\02\03\04\05\06\07", align 1377@arr2 = global [8 x i8] c"\01\02\03\04\05\06\07\08", align 1378@arr3 = global [7 x i8] c"\01\02\03\04\05\06\07", section "foo,bar", align 1379@arr4 = global [8 x i8] c"\01\02\03\04\05\06\07\08", section "foo,bar", align 1380@arr5 = weak global [7 x i8] c"\01\02\03\04\05\06\07", align 1381@arr6 = weak_odr global [7 x i8] c"\01\02\03\04\05\06\07", align 1382@arr7 = external global [7 x i8], align 1383@arr8 = internal global [128 x i8] undef384@arr9 = weak_odr global [128 x i8] undef385@arr10 = dso_local global [8 x i8] c"\01\02\03\04\05\06\07\08", align 1386define void @f9(ptr %dest, i32 %n) "frame-pointer"="all" {387entry:388  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr1, i32 %n, i1 false)389  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr2, i32 %n, i1 false)390  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr3, i32 %n, i1 false)391  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr4, i32 %n, i1 false)392  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr5, i32 %n, i1 false)393  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr6, i32 %n, i1 false)394  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr7, i32 %n, i1 false)395  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr8, i32 %n, i1 false)396  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr9, i32 %n, i1 false)397  call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr @arr10, i32 %n, i1 false)398  ret void399}400 401; CHECK: {{\.data|\.section.+data}}402; CHECK-NOT: .p2align403; CHECK: arr1:404; CHECK-IOS: .p2align 3405; CHECK-DARWIN: .p2align 2406; CHECK-EABI-NOT: .p2align407; CHECK-GNUEABI-NOT: .p2align408; CHECK: arr2:409; CHECK: {{\.section.+foo,bar}}410; CHECK-NOT: .p2align411; CHECK: arr3:412; CHECK-NOT: .p2align413; CHECK: arr4:414; CHECK: {{\.data|\.section.+data}}415; CHECK-NOT: .p2align416; CHECK: arr5:417; CHECK-NOT: .p2align418; CHECK: arr6:419; CHECK-IOS: arr8,128,4420; CHECK-DARWIN: arr8,128,4421; CHECK-EABI: arr8,128,16422; CHECK-GNUEABI: arr8,128,16423; CHECK: .p2align 4424; CHECK: arr9:425; CHECK-IOS: .p2align 3426; CHECK-DARWIN: .p2align 2427; CHECK-EABI: .p2align 2428; CHECK-GNUEABI: .p2align 2429; CHECK: arr10:430 431; CHECK-NOT: arr7:432 433declare void @llvm.memmove.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind434declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind435declare void @llvm.memset.p0.i32(ptr nocapture, i8, i32, i1) nounwind436