1*9880d681SAndroid Build Coastguard Worker; Test memory-to-memory ANDs. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@g1src = global i8 1 6*9880d681SAndroid Build Coastguard Worker@g1dst = global i8 1 7*9880d681SAndroid Build Coastguard Worker@g2src = global i16 2 8*9880d681SAndroid Build Coastguard Worker@g2dst = global i16 2 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; Test the simple i8 case. 11*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8 *%ptr1) { 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 13*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2) 14*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 15*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 16*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 17*9880d681SAndroid Build Coastguard Worker %old = load i8 , i8 *%ptr2 18*9880d681SAndroid Build Coastguard Worker %and = and i8 %val, %old 19*9880d681SAndroid Build Coastguard Worker store i8 %and, i8 *%ptr2 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; ...and again in reverse. 24*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8 *%ptr1) { 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 26*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2) 27*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 28*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 29*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 30*9880d681SAndroid Build Coastguard Worker %old = load i8 , i8 *%ptr2 31*9880d681SAndroid Build Coastguard Worker %and = and i8 %old, %val 32*9880d681SAndroid Build Coastguard Worker store i8 %and, i8 *%ptr2 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; Test i8 cases where one value is zero-extended to 32 bits and the other 37*9880d681SAndroid Build Coastguard Worker; sign-extended. 38*9880d681SAndroid Build Coastguard Workerdefine void @f3(i8 *%ptr1) { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 40*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2) 41*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 42*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 43*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 44*9880d681SAndroid Build Coastguard Worker %extval = zext i8 %val to i32 45*9880d681SAndroid Build Coastguard Worker %old = load i8 , i8 *%ptr2 46*9880d681SAndroid Build Coastguard Worker %extold = sext i8 %old to i32 47*9880d681SAndroid Build Coastguard Worker %and = and i32 %extval, %extold 48*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %and to i8 49*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; ...and again with the extension types reversed. 54*9880d681SAndroid Build Coastguard Workerdefine void @f4(i8 *%ptr1) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 56*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2) 57*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 58*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 59*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 60*9880d681SAndroid Build Coastguard Worker %extval = sext i8 %val to i32 61*9880d681SAndroid Build Coastguard Worker %old = load i8 , i8 *%ptr2 62*9880d681SAndroid Build Coastguard Worker %extold = zext i8 %old to i32 63*9880d681SAndroid Build Coastguard Worker %and = and i32 %extval, %extold 64*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %and to i8 65*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 66*9880d681SAndroid Build Coastguard Worker ret void 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; ...and again with two sign extensions. 70*9880d681SAndroid Build Coastguard Workerdefine void @f5(i8 *%ptr1) { 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 72*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2) 73*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 74*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 75*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 76*9880d681SAndroid Build Coastguard Worker %extval = sext i8 %val to i32 77*9880d681SAndroid Build Coastguard Worker %old = load i8 , i8 *%ptr2 78*9880d681SAndroid Build Coastguard Worker %extold = sext i8 %old to i32 79*9880d681SAndroid Build Coastguard Worker %and = and i32 %extval, %extold 80*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %and to i8 81*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 82*9880d681SAndroid Build Coastguard Worker ret void 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; ...and again with two zero extensions. 86*9880d681SAndroid Build Coastguard Workerdefine void @f6(i8 *%ptr1) { 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 88*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2) 89*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 90*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 91*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 92*9880d681SAndroid Build Coastguard Worker %extval = zext i8 %val to i32 93*9880d681SAndroid Build Coastguard Worker %old = load i8 , i8 *%ptr2 94*9880d681SAndroid Build Coastguard Worker %extold = zext i8 %old to i32 95*9880d681SAndroid Build Coastguard Worker %and = and i32 %extval, %extold 96*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %and to i8 97*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 98*9880d681SAndroid Build Coastguard Worker ret void 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is extended to 64 bits (just one case 102*9880d681SAndroid Build Coastguard Worker; this time). 103*9880d681SAndroid Build Coastguard Workerdefine void @f7(i8 *%ptr1) { 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 105*9880d681SAndroid Build Coastguard Worker; CHECK: nc 1(1,%r2), 0(%r2) 106*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 107*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 108*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 109*9880d681SAndroid Build Coastguard Worker %extval = sext i8 %val to i64 110*9880d681SAndroid Build Coastguard Worker %old = load i8 , i8 *%ptr2 111*9880d681SAndroid Build Coastguard Worker %extold = zext i8 %old to i64 112*9880d681SAndroid Build Coastguard Worker %and = and i64 %extval, %extold 113*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %and to i8 114*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 115*9880d681SAndroid Build Coastguard Worker ret void 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; Test the simple i16 case. 119*9880d681SAndroid Build Coastguard Workerdefine void @f8(i16 *%ptr1) { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 121*9880d681SAndroid Build Coastguard Worker; CHECK: nc 2(2,%r2), 0(%r2) 122*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 123*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i16, i16 *%ptr1, i64 1 124*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr1 125*9880d681SAndroid Build Coastguard Worker %old = load i16 , i16 *%ptr2 126*9880d681SAndroid Build Coastguard Worker %and = and i16 %val, %old 127*9880d681SAndroid Build Coastguard Worker store i16 %and, i16 *%ptr2 128*9880d681SAndroid Build Coastguard Worker ret void 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is extended to 32 bits. 132*9880d681SAndroid Build Coastguard Workerdefine void @f9(i16 *%ptr1) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 134*9880d681SAndroid Build Coastguard Worker; CHECK: nc 2(2,%r2), 0(%r2) 135*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 136*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i16, i16 *%ptr1, i64 1 137*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr1 138*9880d681SAndroid Build Coastguard Worker %extval = zext i16 %val to i32 139*9880d681SAndroid Build Coastguard Worker %old = load i16 , i16 *%ptr2 140*9880d681SAndroid Build Coastguard Worker %extold = sext i16 %old to i32 141*9880d681SAndroid Build Coastguard Worker %and = and i32 %extval, %extold 142*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %and to i16 143*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16 *%ptr2 144*9880d681SAndroid Build Coastguard Worker ret void 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is extended to 64 bits. 148*9880d681SAndroid Build Coastguard Workerdefine void @f10(i16 *%ptr1) { 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 150*9880d681SAndroid Build Coastguard Worker; CHECK: nc 2(2,%r2), 0(%r2) 151*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 152*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i16, i16 *%ptr1, i64 1 153*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr1 154*9880d681SAndroid Build Coastguard Worker %extval = sext i16 %val to i64 155*9880d681SAndroid Build Coastguard Worker %old = load i16 , i16 *%ptr2 156*9880d681SAndroid Build Coastguard Worker %extold = zext i16 %old to i64 157*9880d681SAndroid Build Coastguard Worker %and = and i64 %extval, %extold 158*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %and to i16 159*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16 *%ptr2 160*9880d681SAndroid Build Coastguard Worker ret void 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; Test the simple i32 case. 164*9880d681SAndroid Build Coastguard Workerdefine void @f11(i32 *%ptr1) { 165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 166*9880d681SAndroid Build Coastguard Worker; CHECK: nc 4(4,%r2), 0(%r2) 167*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 168*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr1, i64 1 169*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr1 170*9880d681SAndroid Build Coastguard Worker %old = load i32 , i32 *%ptr2 171*9880d681SAndroid Build Coastguard Worker %and = and i32 %old, %val 172*9880d681SAndroid Build Coastguard Worker store i32 %and, i32 *%ptr2 173*9880d681SAndroid Build Coastguard Worker ret void 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker; Test i32 cases where the value is extended to 64 bits. 177*9880d681SAndroid Build Coastguard Workerdefine void @f12(i32 *%ptr1) { 178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 179*9880d681SAndroid Build Coastguard Worker; CHECK: nc 4(4,%r2), 0(%r2) 180*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 181*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr1, i64 1 182*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr1 183*9880d681SAndroid Build Coastguard Worker %extval = sext i32 %val to i64 184*9880d681SAndroid Build Coastguard Worker %old = load i32 , i32 *%ptr2 185*9880d681SAndroid Build Coastguard Worker %extold = zext i32 %old to i64 186*9880d681SAndroid Build Coastguard Worker %and = and i64 %extval, %extold 187*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %and to i32 188*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32 *%ptr2 189*9880d681SAndroid Build Coastguard Worker ret void 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; Test the i64 case. 193*9880d681SAndroid Build Coastguard Workerdefine void @f13(i64 *%ptr1) { 194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 195*9880d681SAndroid Build Coastguard Worker; CHECK: nc 8(8,%r2), 0(%r2) 196*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 197*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 198*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 199*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2 200*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 201*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2 202*9880d681SAndroid Build Coastguard Worker ret void 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker; Make sure that we don't use NC if the first load is volatile. 206*9880d681SAndroid Build Coastguard Workerdefine void @f14(i64 *%ptr1) { 207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 208*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 209*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 210*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 211*9880d681SAndroid Build Coastguard Worker %val = load volatile i64 , i64 *%ptr1 212*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2 213*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 214*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2 215*9880d681SAndroid Build Coastguard Worker ret void 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; ...likewise the second. 219*9880d681SAndroid Build Coastguard Workerdefine void @f15(i64 *%ptr1) { 220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 221*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 222*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 223*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 224*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 225*9880d681SAndroid Build Coastguard Worker %old = load volatile i64 , i64 *%ptr2 226*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 227*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2 228*9880d681SAndroid Build Coastguard Worker ret void 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker; ...likewise the store. 232*9880d681SAndroid Build Coastguard Workerdefine void @f16(i64 *%ptr1) { 233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 234*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 235*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 236*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 237*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 238*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2 239*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 240*9880d681SAndroid Build Coastguard Worker store volatile i64 %and, i64 *%ptr2 241*9880d681SAndroid Build Coastguard Worker ret void 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker; Test that NC is not used for aligned loads and stores if there is 245*9880d681SAndroid Build Coastguard Worker; no way of telling whether they alias. We don't want to use NC in 246*9880d681SAndroid Build Coastguard Worker; cases where the addresses could be equal. 247*9880d681SAndroid Build Coastguard Workerdefine void @f17(i64 *%ptr1, i64 *%ptr2) { 248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 249*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 250*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 251*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 252*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2 253*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 254*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2 255*9880d681SAndroid Build Coastguard Worker ret void 256*9880d681SAndroid Build Coastguard Worker} 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker; ...but if one of the loads isn't aligned, we can't be sure. 259*9880d681SAndroid Build Coastguard Workerdefine void @f18(i64 *%ptr1, i64 *%ptr2) { 260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18: 261*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 262*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 263*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 2 264*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2 265*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 266*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2 267*9880d681SAndroid Build Coastguard Worker ret void 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker; Repeat the previous test with the operands in the opposite order. 271*9880d681SAndroid Build Coastguard Workerdefine void @f19(i64 *%ptr1, i64 *%ptr2) { 272*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19: 273*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 274*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 275*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 2 276*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2 277*9880d681SAndroid Build Coastguard Worker %and = and i64 %val, %old 278*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2 279*9880d681SAndroid Build Coastguard Worker ret void 280*9880d681SAndroid Build Coastguard Worker} 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker; ...and again with the other operand being unaligned. 283*9880d681SAndroid Build Coastguard Workerdefine void @f20(i64 *%ptr1, i64 *%ptr2) { 284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20: 285*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 286*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 287*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 288*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2, align 2 289*9880d681SAndroid Build Coastguard Worker %and = and i64 %val, %old 290*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2, align 2 291*9880d681SAndroid Build Coastguard Worker ret void 292*9880d681SAndroid Build Coastguard Worker} 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker; Test a case where there is definite overlap. 295*9880d681SAndroid Build Coastguard Workerdefine void @f21(i64 %base) { 296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21: 297*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 298*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 299*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, 1 300*9880d681SAndroid Build Coastguard Worker %ptr1 = inttoptr i64 %base to i64 * 301*9880d681SAndroid Build Coastguard Worker %ptr2 = inttoptr i64 %add to i64 * 302*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 303*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2, align 1 304*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 305*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2, align 1 306*9880d681SAndroid Build Coastguard Worker ret void 307*9880d681SAndroid Build Coastguard Worker} 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker; Test that we can use NC for global addresses for i8. 310*9880d681SAndroid Build Coastguard Workerdefine void @f22(i8 *%ptr) { 311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22: 312*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[SRC:%r[0-5]]], g1src 313*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[DST:%r[0-5]]], g1dst 314*9880d681SAndroid Build Coastguard Worker; CHECK: nc 0(1,[[DST]]), 0([[SRC]]) 315*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 316*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *@g1src 317*9880d681SAndroid Build Coastguard Worker %old = load i8 , i8 *@g1dst 318*9880d681SAndroid Build Coastguard Worker %and = and i8 %val, %old 319*9880d681SAndroid Build Coastguard Worker store i8 %and, i8 *@g1dst 320*9880d681SAndroid Build Coastguard Worker ret void 321*9880d681SAndroid Build Coastguard Worker} 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker; Test that we use NC even where LHRL and STHRL are available. 324*9880d681SAndroid Build Coastguard Workerdefine void @f23(i16 *%ptr) { 325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23: 326*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[SRC:%r[0-5]]], g2src 327*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[DST:%r[0-5]]], g2dst 328*9880d681SAndroid Build Coastguard Worker; CHECK: nc 0(2,[[DST]]), 0([[SRC]]) 329*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 330*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *@g2src 331*9880d681SAndroid Build Coastguard Worker %old = load i16 , i16 *@g2dst 332*9880d681SAndroid Build Coastguard Worker %and = and i16 %val, %old 333*9880d681SAndroid Build Coastguard Worker store i16 %and, i16 *@g2dst 334*9880d681SAndroid Build Coastguard Worker ret void 335*9880d681SAndroid Build Coastguard Worker} 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Worker; Test a case where offset disambiguation is enough. 338*9880d681SAndroid Build Coastguard Workerdefine void @f24(i64 *%ptr1) { 339*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24: 340*9880d681SAndroid Build Coastguard Worker; CHECK: nc 8(8,%r2), 0(%r2) 341*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 342*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 343*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 1 344*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2, align 1 345*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 346*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2, align 1 347*9880d681SAndroid Build Coastguard Worker ret void 348*9880d681SAndroid Build Coastguard Worker} 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Worker; Test a case where TBAA tells us there is no alias. 351*9880d681SAndroid Build Coastguard Workerdefine void @f25(i64 *%ptr1, i64 *%ptr2) { 352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25: 353*9880d681SAndroid Build Coastguard Worker; CHECK: nc 0(8,%r3), 0(%r2) 354*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 355*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 2, !tbaa !3 356*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2, align 2, !tbaa !4 357*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 358*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2, align 2, !tbaa !4 359*9880d681SAndroid Build Coastguard Worker ret void 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Worker; Test a case where TBAA information is present but doesn't help. 363*9880d681SAndroid Build Coastguard Workerdefine void @f26(i64 *%ptr1, i64 *%ptr2) { 364*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26: 365*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nc 366*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 367*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 2, !tbaa !3 368*9880d681SAndroid Build Coastguard Worker %old = load i64 , i64 *%ptr2, align 2, !tbaa !3 369*9880d681SAndroid Build Coastguard Worker %and = and i64 %old, %val 370*9880d681SAndroid Build Coastguard Worker store i64 %and, i64 *%ptr2, align 2, !tbaa !3 371*9880d681SAndroid Build Coastguard Worker ret void 372*9880d681SAndroid Build Coastguard Worker} 373*9880d681SAndroid Build Coastguard Worker 374*9880d681SAndroid Build Coastguard Worker!0 = !{ !"root" } 375*9880d681SAndroid Build Coastguard Worker!1 = !{ !"set1", !0 } 376*9880d681SAndroid Build Coastguard Worker!2 = !{ !"set2", !0 } 377*9880d681SAndroid Build Coastguard Worker!3 = !{ !1, !1, i64 0} 378*9880d681SAndroid Build Coastguard Worker!4 = !{ !2, !2, i64 0} 379