117 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; Test selection of addresses with indices in cases where the address3; is used once.4;5; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s6 7; A simple index address.8define void @f1(i64 %addr, i64 %index) {9; CHECK-LABEL: f1:10; CHECK: # %bb.0:11; CHECK-NEXT: lb %r0, 0(%r3,%r2)12; CHECK-NEXT: br %r1413 %add = add i64 %addr, %index14 %ptr = inttoptr i64 %add to ptr15 %a = load volatile i8, ptr %ptr16 ret void17}18 19; An address with an index and a displacement (order 1).20define void @f2(i64 %addr, i64 %index) {21; CHECK-LABEL: f2:22; CHECK: # %bb.0:23; CHECK-NEXT: lb %r0, 100(%r3,%r2)24; CHECK-NEXT: br %r1425 %add1 = add i64 %addr, %index26 %add2 = add i64 %add1, 10027 %ptr = inttoptr i64 %add2 to ptr28 %a = load volatile i8, ptr %ptr29 ret void30}31 32; An address with an index and a displacement (order 2).33define void @f3(i64 %addr, i64 %index) {34; CHECK-LABEL: f3:35; CHECK: # %bb.0:36; CHECK-NEXT: lb %r0, 100(%r3,%r2)37; CHECK-NEXT: br %r1438 %add1 = add i64 %addr, 10039 %add2 = add i64 %add1, %index40 %ptr = inttoptr i64 %add2 to ptr41 %a = load volatile i8, ptr %ptr42 ret void43}44 45; An address with an index and a subtracted displacement (order 1).46define void @f4(i64 %addr, i64 %index) {47; CHECK-LABEL: f4:48; CHECK: # %bb.0:49; CHECK-NEXT: lb %r0, -100(%r3,%r2)50; CHECK-NEXT: br %r1451 %add1 = add i64 %addr, %index52 %add2 = sub i64 %add1, 10053 %ptr = inttoptr i64 %add2 to ptr54 %a = load volatile i8, ptr %ptr55 ret void56}57 58; An address with an index and a subtracted displacement (order 2).59define void @f5(i64 %addr, i64 %index) {60; CHECK-LABEL: f5:61; CHECK: # %bb.0:62; CHECK-NEXT: lb %r0, -100(%r3,%r2)63; CHECK-NEXT: br %r1464 %add1 = sub i64 %addr, 10065 %add2 = add i64 %add1, %index66 %ptr = inttoptr i64 %add2 to ptr67 %a = load volatile i8, ptr %ptr68 ret void69}70 71; An address with an index and a displacement added using OR.72define void @f6(i64 %addr, i64 %index) {73; CHECK-LABEL: f6:74; CHECK: # %bb.0:75; CHECK-NEXT: nill %r2, 6552876; CHECK-NEXT: lb %r0, 6(%r2,%r3)77; CHECK-NEXT: br %r1478 %aligned = and i64 %addr, -879 %or = or i64 %aligned, 680 %add = add i64 %or, %index81 %ptr = inttoptr i64 %add to ptr82 %a = load volatile i8, ptr %ptr83 ret void84}85 86; Like f6, but without the masking. This OR doesn't count as a displacement.87define void @f7(i64 %addr, i64 %index) {88; CHECK-LABEL: f7:89; CHECK: # %bb.0:90; CHECK-NEXT: oill %r2, 691; CHECK-NEXT: lb %r0, 0(%r3,%r2)92; CHECK-NEXT: br %r1493 %or = or i64 %addr, 694 %add = add i64 %or, %index95 %ptr = inttoptr i64 %add to ptr96 %a = load volatile i8, ptr %ptr97 ret void98}99 100; Like f6, but with the OR applied after the index. We don't know anything101; about the alignment of %add here.102define void @f8(i64 %addr, i64 %index) {103; CHECK-LABEL: f8:104; CHECK: # %bb.0:105; CHECK-NEXT: nill %r2, 65528106; CHECK-NEXT: agr %r2, %r3107; CHECK-NEXT: oill %r2, 6108; CHECK-NEXT: lb %r0, 0(%r2)109; CHECK-NEXT: br %r14110 %aligned = and i64 %addr, -8111 %add = add i64 %aligned, %index112 %or = or i64 %add, 6113 %ptr = inttoptr i64 %or to ptr114 %a = load volatile i8, ptr %ptr115 ret void116}117