148 lines · plain
1; RUN: llc -mtriple=mipsel-elf -O3 -relocation-model=pic < %s | FileCheck %s2 3 4; MIPS direct branches implicitly define register $at. This test makes sure that5; code hoisting optimization (which moves identical instructions at the start of6; two basic blocks to the common predecessor block) takes this into account and7; doesn't move definition of $at to the predecessor block (which would make $at8; live-in at the start of successor block).9 10 11; CHECK-LABEL: readLumaCoeff8x8_CABAC12 13; The check for first "addiu" instruction is added so that we can match the correct "b" instruction.14; CHECK: andi15; CHECK: b $[[BB0:BB[0-9_]+]]16; CHECK: sll17 18; Check that at the start of a fallthrough block there is a instruction that writes to $1.19; CHECK: {{%bb.[0-9]+}}:20; CHECK: sll $1, $[[R0:[0-9]+]], 421; CHECK: lw $[[R1:[0-9]+]], %got(assignSE2partition)($[[R2:[0-9]+]])22 23; Check that identical instructions are at the start of a target block.24; CHECK: [[BB0]]:25; CHECK: sll $1, $[[R0]], 426; CHECK: lw $[[R1]], %got(assignSE2partition)($[[R2]])27 28 29%struct.img_par = type { i32, i32, i32, i32, ptr, 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], ptr, ptr, ptr, ptr, i32, i32, i32, i32, ptr, ptr, i32, i32, i32, i32, i32, i32, ptr, 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, ptr, ptr, ptr, 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%struct.Slice = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, i32, ptr, ptr, ptr, i32, ptr, ptr, ptr, ptr, i32, i32, i32, i32 }31%struct.datapartition = type { ptr, %struct.DecodingEnvironment, ptr }32%struct.Bitstream = type { i32, i32, i32, i32, ptr, i32 }33%struct.DecodingEnvironment = type { i32, i32, i32, i32, i32, ptr, ptr }34%struct.syntaxelement = type { i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr }35%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%struct.BiContextType = type { i16, i8 }37%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%struct.inp_par = type { [1000 x i8], [1000 x i8], [1000 x i8], i32, i32, i32, i32, i32, i32, i32, i32 }39%struct.macroblock = type { i32, [2 x i32], i32, i32, ptr, ptr, 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%struct.DecRefPicMarking_s = type { i32, i32, i32, i32, i32, ptr }41%struct.timeb = type { i32, i16, i16, i16 }42 43@assignSE2partition = external global [0 x [20 x i32]]44@FIELD_SCAN8x8 = external constant [64 x [2 x i8]]45 46 47define void @readLumaCoeff8x8_CABAC(ptr %img, i32 %b8) {48 49 %1 = load i32, ptr undef, align 450 br i1 false, label %2, label %351 52; <label>:2 ; preds = %053 br label %354 55; <label>:3 ; preds = %2, %056 br i1 undef, label %switch.lookup, label %457 58switch.lookup: ; preds = %359 br label %460 61; <label>:4 ; preds = %switch.lookup, %362 br i1 undef, label %5, label %663 64; <label>:5 ; preds = %465 br label %666 67; <label>:6 ; preds = %5, %468 %7 = phi ptr [ @FIELD_SCAN8x8, %4 ], [ null, %5 ]69 br i1 undef, label %switch.lookup6, label %870 71switch.lookup6: ; preds = %672 br label %873 74; <label>:8 ; preds = %switch.lookup6, %675 br i1 undef, label %.loopexit, label %976 77; <label>:9 ; preds = %878 %10 = and i32 %b8, 179 %11 = shl nuw nsw i32 %10, 380 %12 = getelementptr inbounds %struct.Slice, ptr null, i32 0, i32 981 br i1 undef, label %.preheader, label %.preheader1182 83.preheader11: ; preds = %21, %984 %k.014 = phi i32 [ %27, %21 ], [ 0, %9 ]85 %coef_ctr.013 = phi i32 [ %23, %21 ], [ -1, %9 ]86 br i1 false, label %13, label %1487 88; <label>:13 ; preds = %.preheader1189 br label %1590 91; <label>:14 ; preds = %.preheader1192 br label %1593 94; <label>:15 ; preds = %14, %1395 %16 = getelementptr inbounds [0 x [20 x i32]], ptr @assignSE2partition, i32 0, i32 %1, i32 undef96 %17 = load i32, ptr %16, align 497 %18 = getelementptr inbounds %struct.datapartition, ptr null, i32 %17, i32 298 %19 = load ptr, ptr %18, align 499 %20 = call i32 %19(ptr undef, ptr %img, ptr undef)100 br i1 false, label %.loopexit, label %21101 102; <label>:21 ; preds = %15103 %22 = add i32 %coef_ctr.013, 1104 %23 = add i32 %22, 0105 %24 = getelementptr inbounds [2 x i8], ptr %7, i32 %23, i32 0106 %25 = add nsw i32 0, %11107 %26 = getelementptr inbounds %struct.img_par, ptr %img, i32 0, i32 27, i32 undef, i32 %25108 store i32 0, ptr %26, align 4109 %27 = add nsw i32 %k.014, 1110 %28 = icmp slt i32 %27, 65111 br i1 %28, label %.preheader11, label %.loopexit112 113.preheader: ; preds = %36, %9114 %k.110 = phi i32 [ %45, %36 ], [ 0, %9 ]115 %coef_ctr.29 = phi i32 [ %39, %36 ], [ -1, %9 ]116 br i1 false, label %29, label %30117 118; <label>:29 ; preds = %.preheader119 br label %31120 121; <label>:30 ; preds = %.preheader122 br label %31123 124; <label>:31 ; preds = %30, %29125 %32 = getelementptr inbounds [0 x [20 x i32]], ptr @assignSE2partition, i32 0, i32 %1, i32 undef126 %33 = load i32, ptr %32, align 4127 %34 = getelementptr inbounds %struct.datapartition, ptr null, i32 %33128 %35 = call i32 undef(ptr undef, ptr %img, ptr %34)129 br i1 false, label %.loopexit, label %36130 131; <label>:36 ; preds = %31132 %37 = load i32, ptr undef, align 4133 %38 = add i32 %coef_ctr.29, 1134 %39 = add i32 %38, %37135 %40 = getelementptr inbounds [2 x i8], ptr %7, i32 %39, i32 0136 %41 = load i8, ptr %40, align 1137 %42 = zext i8 %41 to i32138 %43 = add nsw i32 %42, %11139 %44 = getelementptr inbounds %struct.img_par, ptr %img, i32 0, i32 27, i32 undef, i32 %43140 store i32 0, ptr %44, align 4141 %45 = add nsw i32 %k.110, 1142 %46 = icmp slt i32 %45, 65143 br i1 %46, label %.preheader, label %.loopexit144 145.loopexit: ; preds = %36, %31, %21, %15, %8146 ret void147}148