346 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8m.main %s -o - | FileCheck %s --check-prefix=CHECK-V8M3; RUN: llc -mtriple=armv8 %s -o - | FileCheck %s --check-prefix=CHECK-V8A4 5define ptr @pre_inc_ldr(ptr %base, i32 %a) {6; CHECK-V8M-LABEL: pre_inc_ldr:7; CHECK-V8M: @ %bb.0:8; CHECK-V8M-NEXT: ldr r2, [r0, #4]!9; CHECK-V8M-NEXT: add r1, r210; CHECK-V8M-NEXT: str r1, [r0, #4]11; CHECK-V8M-NEXT: bx lr12;13; CHECK-V8A-LABEL: pre_inc_ldr:14; CHECK-V8A: @ %bb.0:15; CHECK-V8A-NEXT: ldr r2, [r0, #4]!16; CHECK-V8A-NEXT: add r1, r2, r117; CHECK-V8A-NEXT: str r1, [r0, #4]18; CHECK-V8A-NEXT: bx lr19 %addr = getelementptr i32, ptr %base, i32 120 %ld = load i32, ptr %addr21 %addr.1 = getelementptr i32, ptr %base, i32 222 %res = add i32 %ld, %a23 store i32 %res, ptr %addr.124 ret ptr %addr25}26 27define ptr @pre_dec_ldr(ptr %base, i32 %a) {28; CHECK-V8M-LABEL: pre_dec_ldr:29; CHECK-V8M: @ %bb.0:30; CHECK-V8M-NEXT: ldr r2, [r0, #-4]!31; CHECK-V8M-NEXT: add r1, r232; CHECK-V8M-NEXT: str r1, [r0, #12]33; CHECK-V8M-NEXT: bx lr34;35; CHECK-V8A-LABEL: pre_dec_ldr:36; CHECK-V8A: @ %bb.0:37; CHECK-V8A-NEXT: ldr r2, [r0, #-4]!38; CHECK-V8A-NEXT: add r1, r2, r139; CHECK-V8A-NEXT: str r1, [r0, #12]40; CHECK-V8A-NEXT: bx lr41 %addr = getelementptr i32, ptr %base, i32 -142 %ld = load i32, ptr %addr43 %addr.1 = getelementptr i32, ptr %base, i32 244 %res = add i32 %ld, %a45 store i32 %res, ptr %addr.146 ret ptr %addr47}48 49define ptr @post_inc_ldr(ptr %base, ptr %addr.2, i32 %a) {50; CHECK-V8M-LABEL: post_inc_ldr:51; CHECK-V8M: @ %bb.0:52; CHECK-V8M-NEXT: ldr r3, [r0], #453; CHECK-V8M-NEXT: add r2, r354; CHECK-V8M-NEXT: str r2, [r1]55; CHECK-V8M-NEXT: bx lr56;57; CHECK-V8A-LABEL: post_inc_ldr:58; CHECK-V8A: @ %bb.0:59; CHECK-V8A-NEXT: ldr r3, [r0], #460; CHECK-V8A-NEXT: add r2, r3, r261; CHECK-V8A-NEXT: str r2, [r1]62; CHECK-V8A-NEXT: bx lr63 %ld = load i32, ptr %base64 %addr.1 = getelementptr i32, ptr %base, i32 165 %res = add i32 %ld, %a66 store i32 %res, ptr %addr.267 ret ptr %addr.168}69 70define ptr @post_dec_ldr(ptr %base, ptr %addr.2, i32 %a) {71; CHECK-V8M-LABEL: post_dec_ldr:72; CHECK-V8M: @ %bb.0:73; CHECK-V8M-NEXT: ldr r3, [r0], #-474; CHECK-V8M-NEXT: add r2, r375; CHECK-V8M-NEXT: str r2, [r1]76; CHECK-V8M-NEXT: bx lr77;78; CHECK-V8A-LABEL: post_dec_ldr:79; CHECK-V8A: @ %bb.0:80; CHECK-V8A-NEXT: ldr r3, [r0], #-481; CHECK-V8A-NEXT: add r2, r3, r282; CHECK-V8A-NEXT: str r2, [r1]83; CHECK-V8A-NEXT: bx lr84 %ld = load i32, ptr %base85 %addr.1 = getelementptr i32, ptr %base, i32 -186 %res = add i32 %ld, %a87 store i32 %res, ptr %addr.288 ret ptr %addr.189}90 91define ptr @pre_inc_str(ptr %base, i32 %a, i32 %b) {92; CHECK-V8M-LABEL: pre_inc_str:93; CHECK-V8M: @ %bb.0:94; CHECK-V8M-NEXT: add r1, r295; CHECK-V8M-NEXT: str r1, [r0, #4]!96; CHECK-V8M-NEXT: bx lr97;98; CHECK-V8A-LABEL: pre_inc_str:99; CHECK-V8A: @ %bb.0:100; CHECK-V8A-NEXT: add r1, r1, r2101; CHECK-V8A-NEXT: str r1, [r0, #4]!102; CHECK-V8A-NEXT: bx lr103 %addr.1 = getelementptr i32, ptr %base, i32 1104 %res = add i32 %a, %b105 store i32 %res, ptr %addr.1106 ret ptr %addr.1107}108 109define ptr @pre_dec_str(ptr %base, i32 %a, i32 %b) {110; CHECK-V8M-LABEL: pre_dec_str:111; CHECK-V8M: @ %bb.0:112; CHECK-V8M-NEXT: add r1, r2113; CHECK-V8M-NEXT: str r1, [r0, #-4]!114; CHECK-V8M-NEXT: bx lr115;116; CHECK-V8A-LABEL: pre_dec_str:117; CHECK-V8A: @ %bb.0:118; CHECK-V8A-NEXT: add r1, r1, r2119; CHECK-V8A-NEXT: str r1, [r0, #-4]!120; CHECK-V8A-NEXT: bx lr121 %res = add i32 %a, %b122 %addr.1 = getelementptr i32, ptr %base, i32 -1123 store i32 %res, ptr %addr.1124 ret ptr %addr.1125}126 127define ptr @post_inc_str(ptr %base, i32 %a, i32 %b) {128; CHECK-V8M-LABEL: post_inc_str:129; CHECK-V8M: @ %bb.0:130; CHECK-V8M-NEXT: add r1, r2131; CHECK-V8M-NEXT: str r1, [r0], #4132; CHECK-V8M-NEXT: bx lr133;134; CHECK-V8A-LABEL: post_inc_str:135; CHECK-V8A: @ %bb.0:136; CHECK-V8A-NEXT: add r1, r1, r2137; CHECK-V8A-NEXT: str r1, [r0], #4138; CHECK-V8A-NEXT: bx lr139 %addr.1 = getelementptr i32, ptr %base, i32 1140 %res = add i32 %a, %b141 store i32 %res, ptr %base142 ret ptr %addr.1143}144 145define ptr @post_dec_str(ptr %base, i32 %a, i32 %b) {146; CHECK-V8M-LABEL: post_dec_str:147; CHECK-V8M: @ %bb.0:148; CHECK-V8M-NEXT: add r1, r2149; CHECK-V8M-NEXT: str r1, [r0], #-4150; CHECK-V8M-NEXT: bx lr151;152; CHECK-V8A-LABEL: post_dec_str:153; CHECK-V8A: @ %bb.0:154; CHECK-V8A-NEXT: add r1, r1, r2155; CHECK-V8A-NEXT: str r1, [r0], #-4156; CHECK-V8A-NEXT: bx lr157 %addr.1 = getelementptr i32, ptr %base, i32 -1158 %res = add i32 %a, %b159 store i32 %res, ptr %base160 ret ptr %addr.1161}162 163; TODO: Generate ldrd164define ptr @pre_inc_ldrd(ptr %base) {165; CHECK-V8M-LABEL: pre_inc_ldrd:166; CHECK-V8M: @ %bb.0:167; CHECK-V8M-NEXT: ldr r1, [r0, #4]!168; CHECK-V8M-NEXT: ldr r2, [r0, #4]169; CHECK-V8M-NEXT: add r1, r2170; CHECK-V8M-NEXT: str r1, [r0, #8]171; CHECK-V8M-NEXT: bx lr172;173; CHECK-V8A-LABEL: pre_inc_ldrd:174; CHECK-V8A: @ %bb.0:175; CHECK-V8A-NEXT: ldr r1, [r0, #4]!176; CHECK-V8A-NEXT: ldr r2, [r0, #4]177; CHECK-V8A-NEXT: add r1, r1, r2178; CHECK-V8A-NEXT: str r1, [r0, #8]179; CHECK-V8A-NEXT: bx lr180 %addr = getelementptr i32, ptr %base, i32 1181 %addr.1 = getelementptr i32, ptr %base, i32 2182 %addr.2 = getelementptr i32, ptr %base, i32 3183 %ld = load i32, ptr %addr184 %ld.1 = load i32, ptr %addr.1185 %res = add i32 %ld, %ld.1186 store i32 %res, ptr %addr.2187 ret ptr %addr188}189 190; TODO: Generate ldrd191define ptr @pre_dec_ldrd(ptr %base) {192; CHECK-V8M-LABEL: pre_dec_ldrd:193; CHECK-V8M: @ %bb.0:194; CHECK-V8M-NEXT: ldr r1, [r0, #-4]!195; CHECK-V8M-NEXT: ldr r2, [r0, #-4]196; CHECK-V8M-NEXT: add r1, r2197; CHECK-V8M-NEXT: str r1, [r0, #-8]198; CHECK-V8M-NEXT: bx lr199;200; CHECK-V8A-LABEL: pre_dec_ldrd:201; CHECK-V8A: @ %bb.0:202; CHECK-V8A-NEXT: ldr r1, [r0, #-4]!203; CHECK-V8A-NEXT: ldr r2, [r0, #-4]204; CHECK-V8A-NEXT: add r1, r1, r2205; CHECK-V8A-NEXT: str r1, [r0, #-8]206; CHECK-V8A-NEXT: bx lr207 %addr = getelementptr i32, ptr %base, i32 -1208 %addr.1 = getelementptr i32, ptr %base, i32 -2209 %addr.2 = getelementptr i32, ptr %base, i32 -3210 %ld = load i32, ptr %addr211 %ld.1 = load i32, ptr %addr.1212 %res = add i32 %ld, %ld.1213 store i32 %res, ptr %addr.2214 ret ptr %addr215}216 217; TODO: Generate post inc218define ptr @post_inc_ldrd(ptr %base, ptr %addr.3) {219; CHECK-V8M-LABEL: post_inc_ldrd:220; CHECK-V8M: @ %bb.0:221; CHECK-V8M-NEXT: ldrd r2, r3, [r0], #8222; CHECK-V8M-NEXT: add r2, r3223; CHECK-V8M-NEXT: str r2, [r1]224; CHECK-V8M-NEXT: bx lr225;226; CHECK-V8A-LABEL: post_inc_ldrd:227; CHECK-V8A: @ %bb.0:228; CHECK-V8A-NEXT: ldrd r2, r3, [r0]229; CHECK-V8A-NEXT: add r0, r0, #8230; CHECK-V8A-NEXT: add r2, r2, r3231; CHECK-V8A-NEXT: str r2, [r1]232; CHECK-V8A-NEXT: bx lr233 %ld = load i32, ptr %base234 %addr.1 = getelementptr i32, ptr %base, i32 1235 %ld.1 = load i32, ptr %addr.1236 %addr.2 = getelementptr i32, ptr %base, i32 2237 %res = add i32 %ld, %ld.1238 store i32 %res, ptr %addr.3239 ret ptr %addr.2240}241 242define ptr @pre_inc_str_multi(ptr %base) {243; CHECK-V8M-LABEL: pre_inc_str_multi:244; CHECK-V8M: @ %bb.0:245; CHECK-V8M-NEXT: ldrd r1, r2, [r0]246; CHECK-V8M-NEXT: add r1, r2247; CHECK-V8M-NEXT: str r1, [r0, #8]!248; CHECK-V8M-NEXT: bx lr249;250; CHECK-V8A-LABEL: pre_inc_str_multi:251; CHECK-V8A: @ %bb.0:252; CHECK-V8A-NEXT: ldrd r2, r3, [r0]253; CHECK-V8A-NEXT: add r1, r2, r3254; CHECK-V8A-NEXT: str r1, [r0, #8]!255; CHECK-V8A-NEXT: bx lr256 %addr.1 = getelementptr i32, ptr %base, i32 1257 %ld = load i32, ptr %base258 %ld.1 = load i32, ptr %addr.1259 %res = add i32 %ld, %ld.1260 %addr.2 = getelementptr i32, ptr %base, i32 2261 store i32 %res, ptr %addr.2262 ret ptr %addr.2263}264 265define ptr @pre_dec_str_multi(ptr %base) {266; CHECK-V8M-LABEL: pre_dec_str_multi:267; CHECK-V8M: @ %bb.0:268; CHECK-V8M-NEXT: ldrd r1, r2, [r0]269; CHECK-V8M-NEXT: add r1, r2270; CHECK-V8M-NEXT: str r1, [r0, #-4]!271; CHECK-V8M-NEXT: bx lr272;273; CHECK-V8A-LABEL: pre_dec_str_multi:274; CHECK-V8A: @ %bb.0:275; CHECK-V8A-NEXT: ldrd r2, r3, [r0]276; CHECK-V8A-NEXT: add r1, r2, r3277; CHECK-V8A-NEXT: str r1, [r0, #-4]!278; CHECK-V8A-NEXT: bx lr279 %addr.1 = getelementptr i32, ptr %base, i32 1280 %ld = load i32, ptr %base281 %ld.1 = load i32, ptr %addr.1282 %res = add i32 %ld, %ld.1283 %addr.2 = getelementptr i32, ptr %base, i32 -1284 store i32 %res, ptr %addr.2285 ret ptr %addr.2286}287 288define ptr @illegal_pre_inc_store_1(ptr %base) {289; CHECK-V8M-LABEL: illegal_pre_inc_store_1:290; CHECK-V8M: @ %bb.0: @ %entry291; CHECK-V8M-NEXT: str r0, [r0, #8]292; CHECK-V8M-NEXT: adds r0, #8293; CHECK-V8M-NEXT: bx lr294;295; CHECK-V8A-LABEL: illegal_pre_inc_store_1:296; CHECK-V8A: @ %bb.0: @ %entry297; CHECK-V8A-NEXT: str r0, [r0, #8]298; CHECK-V8A-NEXT: add r0, r0, #8299; CHECK-V8A-NEXT: bx lr300entry:301 %ptr.to.use = getelementptr i32, ptr %base, i32 2302 %ptr.to.store = ptrtoint ptr %base to i32303 store i32 %ptr.to.store, ptr %ptr.to.use, align 4304 ret ptr %ptr.to.use305}306 307define ptr @legal_pre_inc_store_needs_copy_1(ptr %base) {308; CHECK-V8M-LABEL: legal_pre_inc_store_needs_copy_1:309; CHECK-V8M: @ %bb.0: @ %entry310; CHECK-V8M-NEXT: add.w r1, r0, #8311; CHECK-V8M-NEXT: str r1, [r0, #8]312; CHECK-V8M-NEXT: mov r0, r1313; CHECK-V8M-NEXT: bx lr314;315; CHECK-V8A-LABEL: legal_pre_inc_store_needs_copy_1:316; CHECK-V8A: @ %bb.0: @ %entry317; CHECK-V8A-NEXT: add r1, r0, #8318; CHECK-V8A-NEXT: str r1, [r0, #8]319; CHECK-V8A-NEXT: mov r0, r1320; CHECK-V8A-NEXT: bx lr321entry:322 %ptr.to.use = getelementptr i32, ptr %base, i32 2323 %ptr.to.store = ptrtoint ptr %ptr.to.use to i32324 store i32 %ptr.to.store, ptr %ptr.to.use, align 4325 ret ptr %ptr.to.use326}327 328define ptr @legal_pre_inc_store_needs_copy_2(i32 %base) {329; CHECK-V8M-LABEL: legal_pre_inc_store_needs_copy_2:330; CHECK-V8M: @ %bb.0: @ %entry331; CHECK-V8M-NEXT: str r0, [r0, #8]332; CHECK-V8M-NEXT: adds r0, #8333; CHECK-V8M-NEXT: bx lr334;335; CHECK-V8A-LABEL: legal_pre_inc_store_needs_copy_2:336; CHECK-V8A: @ %bb.0: @ %entry337; CHECK-V8A-NEXT: str r0, [r0, #8]338; CHECK-V8A-NEXT: add r0, r0, #8339; CHECK-V8A-NEXT: bx lr340entry:341 %ptr = inttoptr i32 %base to ptr342 %ptr.to.use = getelementptr i32, ptr %ptr, i32 2343 store i32 %base, ptr %ptr.to.use, align 4344 ret ptr %ptr.to.use345}346