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