1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -O3 -relocation-model=pic < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; MIPS direct branches implicitly define register $at. This test makes sure that 5*9880d681SAndroid Build Coastguard Worker; code hoisting optimization (which moves identical instructions at the start of 6*9880d681SAndroid Build Coastguard Worker; two basic blocks to the common predecessor block) takes this into account and 7*9880d681SAndroid Build Coastguard Worker; doesn't move definition of $at to the predecessor block (which would make $at 8*9880d681SAndroid Build Coastguard Worker; live-in at the start of successor block). 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: readLumaCoeff8x8_CABAC 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; The check for first "addiu" instruction is added so that we can match the correct "b" instruction. 14*9880d681SAndroid Build Coastguard Worker; CHECK: andi 15*9880d681SAndroid Build Coastguard Worker; CHECK: b $[[BB0:BB[0-9_]+]] 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sll 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Check that at the start of a fallthrough block there is a instruction that writes to $1. 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: {{BB[0-9_#]+}}: 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: lw $[[R1:[0-9]+]], %got(assignSE2partition)($[[R2:[0-9]+]]) 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sll $1, $[[R0:[0-9]+]], 4 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; Check that identical instructions are at the start of a target block. 24*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0]]: 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: lw $[[R1]], %got(assignSE2partition)($[[R2]]) 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sll $1, $[[R0]], 4 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker%struct.img_par = type { i32, i32, i32, i32, i32*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [16 x [16 x i16]], [6 x [32 x i32]], [16 x [16 x i32]], [4 x [12 x [4 x [4 x i32]]]], [16 x i32], i8**, i32*, i32***, i32**, i32, i32, i32, i32, %struct.Slice*, %struct.macroblock*, i32, i32, i32, i32, i32, i32, %struct.DecRefPicMarking_s*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [3 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32***, i32***, i32****, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [3 x [2 x i32]], [3 x [2 x i32]], i32, i32, i32, i32, %struct.timeb, %struct.timeb, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } 30*9880d681SAndroid Build Coastguard Worker%struct.Slice = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, %struct.datapartition*, %struct.MotionInfoContexts*, %struct.TextureInfoContexts*, i32, i32*, i32*, i32*, i32, i32*, i32*, i32*, i32 (%struct.img_par*, %struct.inp_par*)*, i32, i32, i32, i32 } 31*9880d681SAndroid Build Coastguard Worker%struct.datapartition = type { %struct.Bitstream*, %struct.DecodingEnvironment, i32 (%struct.syntaxelement*, %struct.img_par*, %struct.datapartition*)* } 32*9880d681SAndroid Build Coastguard Worker%struct.Bitstream = type { i32, i32, i32, i32, i8*, i32 } 33*9880d681SAndroid Build Coastguard Worker%struct.DecodingEnvironment = type { i32, i32, i32, i32, i32, i8*, i32* } 34*9880d681SAndroid Build Coastguard Worker%struct.syntaxelement = type { i32, i32, i32, i32, i32, i32, i32, i32, void (i32, i32, i32*, i32*)*, void (%struct.syntaxelement*, %struct.img_par*, %struct.DecodingEnvironment*)* } 35*9880d681SAndroid Build Coastguard Worker%struct.MotionInfoContexts = type { [4 x [11 x %struct.BiContextType]], [2 x [9 x %struct.BiContextType]], [2 x [10 x %struct.BiContextType]], [2 x [6 x %struct.BiContextType]], [4 x %struct.BiContextType], [4 x %struct.BiContextType], [3 x %struct.BiContextType] } 36*9880d681SAndroid Build Coastguard Worker%struct.BiContextType = type { i16, i8 } 37*9880d681SAndroid Build Coastguard Worker%struct.TextureInfoContexts = type { [2 x %struct.BiContextType], [4 x %struct.BiContextType], [3 x [4 x %struct.BiContextType]], [10 x [4 x %struct.BiContextType]], [10 x [15 x %struct.BiContextType]], [10 x [15 x %struct.BiContextType]], [10 x [5 x %struct.BiContextType]], [10 x [5 x %struct.BiContextType]], [10 x [15 x %struct.BiContextType]], [10 x [15 x %struct.BiContextType]] } 38*9880d681SAndroid Build Coastguard Worker%struct.inp_par = type { [1000 x i8], [1000 x i8], [1000 x i8], i32, i32, i32, i32, i32, i32, i32, i32 } 39*9880d681SAndroid Build Coastguard Worker%struct.macroblock = type { i32, [2 x i32], i32, i32, %struct.macroblock*, %struct.macroblock*, i32, [2 x [4 x [4 x [2 x i32]]]], i32, i64, i64, i32, i32, [4 x i8], [4 x i8], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } 40*9880d681SAndroid Build Coastguard Worker%struct.DecRefPicMarking_s = type { i32, i32, i32, i32, i32, %struct.DecRefPicMarking_s* } 41*9880d681SAndroid Build Coastguard Worker%struct.timeb = type { i32, i16, i16, i16 } 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker@assignSE2partition = external global [0 x [20 x i32]] 44*9880d681SAndroid Build Coastguard Worker@FIELD_SCAN8x8 = external constant [64 x [2 x i8]] 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine void @readLumaCoeff8x8_CABAC(%struct.img_par* %img, i32 %b8) { 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* undef, align 4 50*9880d681SAndroid Build Coastguard Worker br i1 false, label %2, label %3 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; <label>:2 ; preds = %0 53*9880d681SAndroid Build Coastguard Worker br label %3 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; <label>:3 ; preds = %2, %0 56*9880d681SAndroid Build Coastguard Worker br i1 undef, label %switch.lookup, label %4 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerswitch.lookup: ; preds = %3 59*9880d681SAndroid Build Coastguard Worker br label %4 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; <label>:4 ; preds = %switch.lookup, %3 62*9880d681SAndroid Build Coastguard Worker br i1 undef, label %5, label %6 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; <label>:5 ; preds = %4 65*9880d681SAndroid Build Coastguard Worker br label %6 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; <label>:6 ; preds = %5, %4 68*9880d681SAndroid Build Coastguard Worker %7 = phi [2 x i8]* [ getelementptr inbounds ([64 x [2 x i8]], [64 x [2 x i8]]* @FIELD_SCAN8x8, i32 0, i32 0), %4 ], [ null, %5 ] 69*9880d681SAndroid Build Coastguard Worker br i1 undef, label %switch.lookup6, label %8 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerswitch.lookup6: ; preds = %6 72*9880d681SAndroid Build Coastguard Worker br label %8 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; <label>:8 ; preds = %switch.lookup6, %6 75*9880d681SAndroid Build Coastguard Worker br i1 undef, label %.loopexit, label %9 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; <label>:9 ; preds = %8 78*9880d681SAndroid Build Coastguard Worker %10 = and i32 %b8, 1 79*9880d681SAndroid Build Coastguard Worker %11 = shl nuw nsw i32 %10, 3 80*9880d681SAndroid Build Coastguard Worker %12 = getelementptr inbounds %struct.Slice, %struct.Slice* null, i32 0, i32 9 81*9880d681SAndroid Build Coastguard Worker br i1 undef, label %.preheader, label %.preheader11 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker.preheader11: ; preds = %21, %9 84*9880d681SAndroid Build Coastguard Worker %k.014 = phi i32 [ %27, %21 ], [ 0, %9 ] 85*9880d681SAndroid Build Coastguard Worker %coef_ctr.013 = phi i32 [ %23, %21 ], [ -1, %9 ] 86*9880d681SAndroid Build Coastguard Worker br i1 false, label %13, label %14 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; <label>:13 ; preds = %.preheader11 89*9880d681SAndroid Build Coastguard Worker br label %15 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; <label>:14 ; preds = %.preheader11 92*9880d681SAndroid Build Coastguard Worker br label %15 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; <label>:15 ; preds = %14, %13 95*9880d681SAndroid Build Coastguard Worker %16 = getelementptr inbounds [0 x [20 x i32]], [0 x [20 x i32]]* @assignSE2partition, i32 0, i32 %1, i32 undef 96*9880d681SAndroid Build Coastguard Worker %17 = load i32, i32* %16, align 4 97*9880d681SAndroid Build Coastguard Worker %18 = getelementptr inbounds %struct.datapartition, %struct.datapartition* null, i32 %17, i32 2 98*9880d681SAndroid Build Coastguard Worker %19 = load i32 (%struct.syntaxelement*, %struct.img_par*, %struct.datapartition*)*, i32 (%struct.syntaxelement*, %struct.img_par*, %struct.datapartition*)** %18, align 4 99*9880d681SAndroid Build Coastguard Worker %20 = call i32 %19(%struct.syntaxelement* undef, %struct.img_par* %img, %struct.datapartition* undef) 100*9880d681SAndroid Build Coastguard Worker br i1 false, label %.loopexit, label %21 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; <label>:21 ; preds = %15 103*9880d681SAndroid Build Coastguard Worker %22 = add i32 %coef_ctr.013, 1 104*9880d681SAndroid Build Coastguard Worker %23 = add i32 %22, 0 105*9880d681SAndroid Build Coastguard Worker %24 = getelementptr inbounds [2 x i8], [2 x i8]* %7, i32 %23, i32 0 106*9880d681SAndroid Build Coastguard Worker %25 = add nsw i32 0, %11 107*9880d681SAndroid Build Coastguard Worker %26 = getelementptr inbounds %struct.img_par, %struct.img_par* %img, i32 0, i32 27, i32 undef, i32 %25 108*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %26, align 4 109*9880d681SAndroid Build Coastguard Worker %27 = add nsw i32 %k.014, 1 110*9880d681SAndroid Build Coastguard Worker %28 = icmp slt i32 %27, 65 111*9880d681SAndroid Build Coastguard Worker br i1 %28, label %.preheader11, label %.loopexit 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker.preheader: ; preds = %36, %9 114*9880d681SAndroid Build Coastguard Worker %k.110 = phi i32 [ %45, %36 ], [ 0, %9 ] 115*9880d681SAndroid Build Coastguard Worker %coef_ctr.29 = phi i32 [ %39, %36 ], [ -1, %9 ] 116*9880d681SAndroid Build Coastguard Worker br i1 false, label %29, label %30 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; <label>:29 ; preds = %.preheader 119*9880d681SAndroid Build Coastguard Worker br label %31 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; <label>:30 ; preds = %.preheader 122*9880d681SAndroid Build Coastguard Worker br label %31 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; <label>:31 ; preds = %30, %29 125*9880d681SAndroid Build Coastguard Worker %32 = getelementptr inbounds [0 x [20 x i32]], [0 x [20 x i32]]* @assignSE2partition, i32 0, i32 %1, i32 undef 126*9880d681SAndroid Build Coastguard Worker %33 = load i32, i32* %32, align 4 127*9880d681SAndroid Build Coastguard Worker %34 = getelementptr inbounds %struct.datapartition, %struct.datapartition* null, i32 %33 128*9880d681SAndroid Build Coastguard Worker %35 = call i32 undef(%struct.syntaxelement* undef, %struct.img_par* %img, %struct.datapartition* %34) 129*9880d681SAndroid Build Coastguard Worker br i1 false, label %.loopexit, label %36 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; <label>:36 ; preds = %31 132*9880d681SAndroid Build Coastguard Worker %37 = load i32, i32* undef, align 4 133*9880d681SAndroid Build Coastguard Worker %38 = add i32 %coef_ctr.29, 1 134*9880d681SAndroid Build Coastguard Worker %39 = add i32 %38, %37 135*9880d681SAndroid Build Coastguard Worker %40 = getelementptr inbounds [2 x i8], [2 x i8]* %7, i32 %39, i32 0 136*9880d681SAndroid Build Coastguard Worker %41 = load i8, i8* %40, align 1 137*9880d681SAndroid Build Coastguard Worker %42 = zext i8 %41 to i32 138*9880d681SAndroid Build Coastguard Worker %43 = add nsw i32 %42, %11 139*9880d681SAndroid Build Coastguard Worker %44 = getelementptr inbounds %struct.img_par, %struct.img_par* %img, i32 0, i32 27, i32 undef, i32 %43 140*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %44, align 4 141*9880d681SAndroid Build Coastguard Worker %45 = add nsw i32 %k.110, 1 142*9880d681SAndroid Build Coastguard Worker %46 = icmp slt i32 %45, 65 143*9880d681SAndroid Build Coastguard Worker br i1 %46, label %.preheader, label %.loopexit 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker.loopexit: ; preds = %36, %31, %21, %15, %8 146*9880d681SAndroid Build Coastguard Worker ret void 147*9880d681SAndroid Build Coastguard Worker} 148