1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -fast-isel-abort=1 -verify-machineinstrs -mtriple=arm64-apple-darwin < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine void @t0(i32 %a) nounwind { 4*9880d681SAndroid Build Coastguard Workerentry: 5*9880d681SAndroid Build Coastguard Worker; CHECK: t0 6*9880d681SAndroid Build Coastguard Worker; CHECK: str {{w[0-9]+}}, [sp, #12] 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[REGISTER:w[0-9]+]], [sp, #12] 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[REGISTER]], [sp, #12] 9*9880d681SAndroid Build Coastguard Worker; CHECK: ret 10*9880d681SAndroid Build Coastguard Worker %a.addr = alloca i32, align 4 11*9880d681SAndroid Build Coastguard Worker store i32 %a, i32* %a.addr 12*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %a.addr 13*9880d681SAndroid Build Coastguard Worker store i32 %tmp, i32* %a.addr 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine void @t1(i64 %a) nounwind { 18*9880d681SAndroid Build Coastguard Worker; CHECK: t1 19*9880d681SAndroid Build Coastguard Worker; CHECK: str {{x[0-9]+}}, [sp, #8] 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[REGISTER:x[0-9]+]], [sp, #8] 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[REGISTER]], [sp, #8] 22*9880d681SAndroid Build Coastguard Worker; CHECK: ret 23*9880d681SAndroid Build Coastguard Worker %a.addr = alloca i64, align 4 24*9880d681SAndroid Build Coastguard Worker store i64 %a, i64* %a.addr 25*9880d681SAndroid Build Coastguard Worker %tmp = load i64, i64* %a.addr 26*9880d681SAndroid Build Coastguard Worker store i64 %tmp, i64* %a.addr 27*9880d681SAndroid Build Coastguard Worker ret void 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @i1(i1 %a) nounwind { 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker; CHECK: @i1 33*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, w0, #0x1 34*9880d681SAndroid Build Coastguard Worker; CHECK: strb w0, [sp, #15] 35*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb w0, [sp, #15] 36*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, w0, #0x1 37*9880d681SAndroid Build Coastguard Worker; CHECK: and w0, w0, #0x1 38*9880d681SAndroid Build Coastguard Worker; CHECK: add sp, sp, #16 39*9880d681SAndroid Build Coastguard Worker; CHECK: ret 40*9880d681SAndroid Build Coastguard Worker %a.addr = alloca i1, align 1 41*9880d681SAndroid Build Coastguard Worker store i1 %a, i1* %a.addr, align 1 42*9880d681SAndroid Build Coastguard Worker %0 = load i1, i1* %a.addr, align 1 43*9880d681SAndroid Build Coastguard Worker ret i1 %0 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i32 @t2(i32 *%ptr) nounwind { 47*9880d681SAndroid Build Coastguard Workerentry: 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2: 49*9880d681SAndroid Build Coastguard Worker; CHECK: ldur w0, [x0, #-4] 50*9880d681SAndroid Build Coastguard Worker; CHECK: ret 51*9880d681SAndroid Build Coastguard Worker %0 = getelementptr i32, i32 *%ptr, i32 -1 52*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %0, align 4 53*9880d681SAndroid Build Coastguard Worker ret i32 %1 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine i32 @t3(i32 *%ptr) nounwind { 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3: 59*9880d681SAndroid Build Coastguard Worker; CHECK: ldur w0, [x0, #-256] 60*9880d681SAndroid Build Coastguard Worker; CHECK: ret 61*9880d681SAndroid Build Coastguard Worker %0 = getelementptr i32, i32 *%ptr, i32 -64 62*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %0, align 4 63*9880d681SAndroid Build Coastguard Worker ret i32 %1 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine void @t4(i32 *%ptr) nounwind { 67*9880d681SAndroid Build Coastguard Workerentry: 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4: 69*9880d681SAndroid Build Coastguard Worker; CHECK: stur wzr, [x0, #-4] 70*9880d681SAndroid Build Coastguard Worker; CHECK: ret 71*9880d681SAndroid Build Coastguard Worker %0 = getelementptr i32, i32 *%ptr, i32 -1 72*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %0, align 4 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine void @t5(i32 *%ptr) nounwind { 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5: 79*9880d681SAndroid Build Coastguard Worker; CHECK: stur wzr, [x0, #-256] 80*9880d681SAndroid Build Coastguard Worker; CHECK: ret 81*9880d681SAndroid Build Coastguard Worker %0 = getelementptr i32, i32 *%ptr, i32 -64 82*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %0, align 4 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdefine void @t6() nounwind { 87*9880d681SAndroid Build Coastguard Worker; CHECK: t6 88*9880d681SAndroid Build Coastguard Worker; CHECK: brk #0x1 89*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() 90*9880d681SAndroid Build Coastguard Worker ret void 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.trap() nounwind 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine void @ands(i32* %addr) { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ands: 97*9880d681SAndroid Build Coastguard Worker; CHECK: tst [[COND:w[0-9]+]], #0x1 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel [[COND]], 99*9880d681SAndroid Build Coastguard Workerentry: 100*9880d681SAndroid Build Coastguard Worker %cond91 = select i1 undef, i32 1, i32 2 101*9880d681SAndroid Build Coastguard Worker store i32 %cond91, i32* %addr, align 4 102*9880d681SAndroid Build Coastguard Worker ret void 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine i64 @mul_umul(i64 %arg) { 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mul_umul: 107*9880d681SAndroid Build Coastguard Worker; CHECK: mul x{{[0-9]+}}, [[ARG1:x[0-9]+]], [[ARG2:x[0-9]+]] 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: umulh x{{[0-9]+}}, [[ARG1]], [[ARG2]] 109*9880d681SAndroid Build Coastguard Workerentry: 110*9880d681SAndroid Build Coastguard Worker %sub.ptr.div = sdiv exact i64 %arg, 8 111*9880d681SAndroid Build Coastguard Worker %tmp = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %sub.ptr.div, i64 8) 112*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i64, i1 } %tmp, 0 113*9880d681SAndroid Build Coastguard Worker ret i64 %tmp1 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdeclare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine void @logicalReg() { 119*9880d681SAndroid Build Coastguard Worker; Make sure we generate a logical reg = reg, reg instruction without any 120*9880d681SAndroid Build Coastguard Worker; machine verifier errors. 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: logicalReg: 122*9880d681SAndroid Build Coastguard Worker; CHECK: orr w{{[0-9]+}}, w{{[0-9]+}}, w{{[0-9]+}} 123*9880d681SAndroid Build Coastguard Worker; CHECK: ret 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker br i1 undef, label %cond.end, label %cond.false 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workercond.false: 128*9880d681SAndroid Build Coastguard Worker %cond = select i1 undef, i1 true, i1 false 129*9880d681SAndroid Build Coastguard Worker br label %cond.end 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workercond.end: 132*9880d681SAndroid Build Coastguard Worker %cond13 = phi i1 [ %cond, %cond.false ], [ true, %entry ] 133*9880d681SAndroid Build Coastguard Worker ret void 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136