1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -O3 -mtriple=armv6-apple-darwin -relocation-model=pic -mcpu=arm1136jf-s -arm-atomic-cfg-tidy=0 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; rdar://8959122 illegal register operands for UMULL instruction 3*9880d681SAndroid Build Coastguard Worker; in cfrac nightly test. 4*9880d681SAndroid Build Coastguard Worker; Armv6 generates a umull that must write to two distinct destination regs. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; ModuleID = 'bugpoint-reduced-simplified.bc' 7*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:64-n32" 8*9880d681SAndroid Build Coastguard Workertarget triple = "armv6-apple-darwin10" 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine void @ptoa(i1 %tst, i8* %p8, i8 %val8) nounwind { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb3, label %bb 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 15*9880d681SAndroid Build Coastguard Worker br label %bb3 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb, %entry 18*9880d681SAndroid Build Coastguard Worker %0 = call noalias i8* @malloc() nounwind 19*9880d681SAndroid Build Coastguard Worker br i1 %tst, label %bb46, label %bb8 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerbb8: ; preds = %bb3 22*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds i8, i8* %0, i32 0 23*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %1, align 1 24*9880d681SAndroid Build Coastguard Worker %2 = call i32 @ptou() nounwind 25*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 26*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 27*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 28*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 29*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 30*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 31*9880d681SAndroid Build Coastguard Worker %3 = udiv i32 %2, 10 32*9880d681SAndroid Build Coastguard Worker %4 = urem i32 %3, 10 33*9880d681SAndroid Build Coastguard Worker %5 = icmp ult i32 %4, 10 34*9880d681SAndroid Build Coastguard Worker %6 = trunc i32 %4 to i8 35*9880d681SAndroid Build Coastguard Worker %7 = or i8 %6, 48 36*9880d681SAndroid Build Coastguard Worker %8 = add i8 %6, 87 37*9880d681SAndroid Build Coastguard Worker %iftmp.5.0.1 = select i1 %5, i8 %7, i8 %8 38*9880d681SAndroid Build Coastguard Worker store i8 %iftmp.5.0.1, i8* %p8, align 1 39*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 40*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 41*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 42*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 43*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 44*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 45*9880d681SAndroid Build Coastguard Worker %9 = udiv i32 %2, 100 46*9880d681SAndroid Build Coastguard Worker %10 = urem i32 %9, 10 47*9880d681SAndroid Build Coastguard Worker %11 = icmp ult i32 %10, 10 48*9880d681SAndroid Build Coastguard Worker %12 = trunc i32 %10 to i8 49*9880d681SAndroid Build Coastguard Worker %13 = or i8 %12, 48 50*9880d681SAndroid Build Coastguard Worker %14 = add i8 %12, 87 51*9880d681SAndroid Build Coastguard Worker %iftmp.5.0.2 = select i1 %11, i8 %13, i8 %14 52*9880d681SAndroid Build Coastguard Worker store i8 %iftmp.5.0.2, i8* %p8, align 1 53*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 54*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 55*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 56*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 57*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 58*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 59*9880d681SAndroid Build Coastguard Worker %15 = udiv i32 %2, 10000 60*9880d681SAndroid Build Coastguard Worker %16 = urem i32 %15, 10 61*9880d681SAndroid Build Coastguard Worker %17 = icmp ult i32 %16, 10 62*9880d681SAndroid Build Coastguard Worker %18 = trunc i32 %16 to i8 63*9880d681SAndroid Build Coastguard Worker %19 = or i8 %18, 48 64*9880d681SAndroid Build Coastguard Worker %20 = add i8 %18, 87 65*9880d681SAndroid Build Coastguard Worker %iftmp.5.0.4 = select i1 %17, i8 %19, i8 %20 66*9880d681SAndroid Build Coastguard Worker store i8 %iftmp.5.0.4, i8* null, align 1 67*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 68*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 69*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 70*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 71*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 72*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 73*9880d681SAndroid Build Coastguard Worker %21 = udiv i32 %2, 100000 74*9880d681SAndroid Build Coastguard Worker %22 = urem i32 %21, 10 75*9880d681SAndroid Build Coastguard Worker %23 = icmp ult i32 %22, 10 76*9880d681SAndroid Build Coastguard Worker %iftmp.5.0.5 = select i1 %23, i8 0, i8 %val8 77*9880d681SAndroid Build Coastguard Worker store i8 %iftmp.5.0.5, i8* %p8, align 1 78*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 79*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 80*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 81*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 82*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 83*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 84*9880d681SAndroid Build Coastguard Worker %24 = udiv i32 %2, 1000000 85*9880d681SAndroid Build Coastguard Worker %25 = urem i32 %24, 10 86*9880d681SAndroid Build Coastguard Worker %26 = icmp ult i32 %25, 10 87*9880d681SAndroid Build Coastguard Worker %27 = trunc i32 %25 to i8 88*9880d681SAndroid Build Coastguard Worker %28 = or i8 %27, 48 89*9880d681SAndroid Build Coastguard Worker %29 = add i8 %27, 87 90*9880d681SAndroid Build Coastguard Worker %iftmp.5.0.6 = select i1 %26, i8 %28, i8 %29 91*9880d681SAndroid Build Coastguard Worker store i8 %iftmp.5.0.6, i8* %p8, align 1 92*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 93*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 94*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 95*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 96*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 97*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 98*9880d681SAndroid Build Coastguard Worker %30 = udiv i32 %2, 10000000 99*9880d681SAndroid Build Coastguard Worker %31 = urem i32 %30, 10 100*9880d681SAndroid Build Coastguard Worker %32 = icmp ult i32 %31, 10 101*9880d681SAndroid Build Coastguard Worker %33 = trunc i32 %31 to i8 102*9880d681SAndroid Build Coastguard Worker %34 = or i8 %33, 48 103*9880d681SAndroid Build Coastguard Worker %35 = add i8 %33, 87 104*9880d681SAndroid Build Coastguard Worker %iftmp.5.0.7 = select i1 %32, i8 %34, i8 %35 105*9880d681SAndroid Build Coastguard Worker store i8 %iftmp.5.0.7, i8* %p8, align 1 106*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 107*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 108*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 109*9880d681SAndroid Build Coastguard Worker ; CHECK: umull [[REGISTER:lr|r[0-9]+]], 110*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: [[REGISTER]], 111*9880d681SAndroid Build Coastguard Worker ; CHECK: {{lr|r[0-9]+}}, {{lr|r[0-9]+$}} 112*9880d681SAndroid Build Coastguard Worker %36 = udiv i32 %2, 100000000 113*9880d681SAndroid Build Coastguard Worker %37 = urem i32 %36, 10 114*9880d681SAndroid Build Coastguard Worker %38 = icmp ult i32 %37, 10 115*9880d681SAndroid Build Coastguard Worker %39 = trunc i32 %37 to i8 116*9880d681SAndroid Build Coastguard Worker %40 = or i8 %39, 48 117*9880d681SAndroid Build Coastguard Worker %41 = add i8 %39, 87 118*9880d681SAndroid Build Coastguard Worker %iftmp.5.0.8 = select i1 %38, i8 %40, i8 %41 119*9880d681SAndroid Build Coastguard Worker store i8 %iftmp.5.0.8, i8* null, align 1 120*9880d681SAndroid Build Coastguard Worker br label %bb46 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerbb46: ; preds = %bb3 123*9880d681SAndroid Build Coastguard Worker ret void 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @malloc() nounwind 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdeclare i32 @ptou() 129