1 ; Test selection of addresses with indices in cases where the address 2 ; is used once. 3 ; 4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 5 6 ; A simple index address. 7 define void @f1(i64 %addr, i64 %index) { 8 ; CHECK-LABEL: f1: 9 ; CHECK: lb %r0, 0(%r3,%r2) 10 ; CHECK: br %r14 11 %add = add i64 %addr, %index 12 %ptr = inttoptr i64 %add to i8 * 13 %a = load volatile i8 , i8 *%ptr 14 ret void 15 } 16 17 ; An address with an index and a displacement (order 1). 18 define void @f2(i64 %addr, i64 %index) { 19 ; CHECK-LABEL: f2: 20 ; CHECK: lb %r0, 100(%r3,%r2) 21 ; CHECK: br %r14 22 %add1 = add i64 %addr, %index 23 %add2 = add i64 %add1, 100 24 %ptr = inttoptr i64 %add2 to i8 * 25 %a = load volatile i8 , i8 *%ptr 26 ret void 27 } 28 29 ; An address with an index and a displacement (order 2). 30 define void @f3(i64 %addr, i64 %index) { 31 ; CHECK-LABEL: f3: 32 ; CHECK: lb %r0, 100(%r3,%r2) 33 ; CHECK: br %r14 34 %add1 = add i64 %addr, 100 35 %add2 = add i64 %add1, %index 36 %ptr = inttoptr i64 %add2 to i8 * 37 %a = load volatile i8 , i8 *%ptr 38 ret void 39 } 40 41 ; An address with an index and a subtracted displacement (order 1). 42 define void @f4(i64 %addr, i64 %index) { 43 ; CHECK-LABEL: f4: 44 ; CHECK: lb %r0, -100(%r3,%r2) 45 ; CHECK: br %r14 46 %add1 = add i64 %addr, %index 47 %add2 = sub i64 %add1, 100 48 %ptr = inttoptr i64 %add2 to i8 * 49 %a = load volatile i8 , i8 *%ptr 50 ret void 51 } 52 53 ; An address with an index and a subtracted displacement (order 2). 54 define void @f5(i64 %addr, i64 %index) { 55 ; CHECK-LABEL: f5: 56 ; CHECK: lb %r0, -100(%r3,%r2) 57 ; CHECK: br %r14 58 %add1 = sub i64 %addr, 100 59 %add2 = add i64 %add1, %index 60 %ptr = inttoptr i64 %add2 to i8 * 61 %a = load volatile i8 , i8 *%ptr 62 ret void 63 } 64 65 ; An address with an index and a displacement added using OR. 66 define void @f6(i64 %addr, i64 %index) { 67 ; CHECK-LABEL: f6: 68 ; CHECK: nill %r2, 65528 69 ; CHECK: lb %r0, 6(%r3,%r2) 70 ; CHECK: br %r14 71 %aligned = and i64 %addr, -8 72 %or = or i64 %aligned, 6 73 %add = add i64 %or, %index 74 %ptr = inttoptr i64 %add to i8 * 75 %a = load volatile i8 , i8 *%ptr 76 ret void 77 } 78 79 ; Like f6, but without the masking. This OR doesn't count as a displacement. 80 define void @f7(i64 %addr, i64 %index) { 81 ; CHECK-LABEL: f7: 82 ; CHECK: oill %r2, 6 83 ; CHECK: lb %r0, 0(%r3,%r2) 84 ; CHECK: br %r14 85 %or = or i64 %addr, 6 86 %add = add i64 %or, %index 87 %ptr = inttoptr i64 %add to i8 * 88 %a = load volatile i8 , i8 *%ptr 89 ret void 90 } 91 92 ; Like f6, but with the OR applied after the index. We don't know anything 93 ; about the alignment of %add here. 94 define void @f8(i64 %addr, i64 %index) { 95 ; CHECK-LABEL: f8: 96 ; CHECK: nill %r2, 65528 97 ; CHECK: agr %r2, %r3 98 ; CHECK: oill %r2, 6 99 ; CHECK: lb %r0, 0(%r2) 100 ; CHECK: br %r14 101 %aligned = and i64 %addr, -8 102 %add = add i64 %aligned, %index 103 %or = or i64 %add, 6 104 %ptr = inttoptr i64 %or to i8 * 105 %a = load volatile i8 , i8 *%ptr 106 ret void 107 } 108