Mercurial > hg > CbC > CbC_llvm
comparison test/CodeGen/Mips/prevent-hoisting.ll @ 77:54457678186b LLVM3.6
LLVM 3.6
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Sep 2014 22:06:00 +0900 |
parents | |
children | 60c9769439b8 |
comparison
equal
deleted
inserted
replaced
34:e874dbf0ad9d | 77:54457678186b |
---|---|
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 "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 | |
17 ; Check that sll instruction that writes to $1 starts basic block. | |
18 ; CHECK: {{BB[0-9_#]+}}: | |
19 ; CHECK-NEXT: sll $1, $[[R0:[0-9]+]], 4 | |
20 | |
21 ; Check that identical sll instruction starts another basic block. | |
22 ; CHECK: [[BB0]]: | |
23 ; CHECK-NEXT: sll $1, $[[R0]], 4 | |
24 | |
25 | |
26 %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 } | |
27 %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 } | |
28 %struct.datapartition = type { %struct.Bitstream*, %struct.DecodingEnvironment, i32 (%struct.syntaxelement*, %struct.img_par*, %struct.datapartition*)* } | |
29 %struct.Bitstream = type { i32, i32, i32, i32, i8*, i32 } | |
30 %struct.DecodingEnvironment = type { i32, i32, i32, i32, i32, i8*, i32* } | |
31 %struct.syntaxelement = type { i32, i32, i32, i32, i32, i32, i32, i32, void (i32, i32, i32*, i32*)*, void (%struct.syntaxelement*, %struct.img_par*, %struct.DecodingEnvironment*)* } | |
32 %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] } | |
33 %struct.BiContextType = type { i16, i8 } | |
34 %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]] } | |
35 %struct.inp_par = type { [1000 x i8], [1000 x i8], [1000 x i8], i32, i32, i32, i32, i32, i32, i32, i32 } | |
36 %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 } | |
37 %struct.DecRefPicMarking_s = type { i32, i32, i32, i32, i32, %struct.DecRefPicMarking_s* } | |
38 %struct.timeb = type { i32, i16, i16, i16 } | |
39 | |
40 @assignSE2partition = external global [0 x [20 x i32]] | |
41 @FIELD_SCAN8x8 = external constant [64 x [2 x i8]] | |
42 | |
43 | |
44 define void @readLumaCoeff8x8_CABAC(%struct.img_par* %img, i32 %b8) { | |
45 | |
46 %1 = load i32* undef, align 4 | |
47 br i1 false, label %2, label %3 | |
48 | |
49 ; <label>:2 ; preds = %0 | |
50 br label %3 | |
51 | |
52 ; <label>:3 ; preds = %2, %0 | |
53 br i1 undef, label %switch.lookup, label %4 | |
54 | |
55 switch.lookup: ; preds = %3 | |
56 br label %4 | |
57 | |
58 ; <label>:4 ; preds = %switch.lookup, %3 | |
59 br i1 undef, label %5, label %6 | |
60 | |
61 ; <label>:5 ; preds = %4 | |
62 br label %6 | |
63 | |
64 ; <label>:6 ; preds = %5, %4 | |
65 %7 = phi [2 x i8]* [ getelementptr inbounds ([64 x [2 x i8]]* @FIELD_SCAN8x8, i32 0, i32 0), %4 ], [ null, %5 ] | |
66 br i1 undef, label %switch.lookup6, label %8 | |
67 | |
68 switch.lookup6: ; preds = %6 | |
69 br label %8 | |
70 | |
71 ; <label>:8 ; preds = %switch.lookup6, %6 | |
72 br i1 undef, label %.loopexit, label %9 | |
73 | |
74 ; <label>:9 ; preds = %8 | |
75 %10 = and i32 %b8, 1 | |
76 %11 = shl nuw nsw i32 %10, 3 | |
77 %12 = getelementptr inbounds %struct.Slice* null, i32 0, i32 9 | |
78 br i1 undef, label %.preheader, label %.preheader11 | |
79 | |
80 .preheader11: ; preds = %21, %9 | |
81 %k.014 = phi i32 [ %27, %21 ], [ 0, %9 ] | |
82 %coef_ctr.013 = phi i32 [ %23, %21 ], [ -1, %9 ] | |
83 br i1 false, label %13, label %14 | |
84 | |
85 ; <label>:13 ; preds = %.preheader11 | |
86 br label %15 | |
87 | |
88 ; <label>:14 ; preds = %.preheader11 | |
89 br label %15 | |
90 | |
91 ; <label>:15 ; preds = %14, %13 | |
92 %16 = getelementptr inbounds [0 x [20 x i32]]* @assignSE2partition, i32 0, i32 %1, i32 undef | |
93 %17 = load i32* %16, align 4 | |
94 %18 = getelementptr inbounds %struct.datapartition* null, i32 %17, i32 2 | |
95 %19 = load i32 (%struct.syntaxelement*, %struct.img_par*, %struct.datapartition*)** %18, align 4 | |
96 %20 = call i32 %19(%struct.syntaxelement* undef, %struct.img_par* %img, %struct.datapartition* undef) | |
97 br i1 false, label %.loopexit, label %21 | |
98 | |
99 ; <label>:21 ; preds = %15 | |
100 %22 = add i32 %coef_ctr.013, 1 | |
101 %23 = add i32 %22, 0 | |
102 %24 = getelementptr inbounds [2 x i8]* %7, i32 %23, i32 0 | |
103 %25 = add nsw i32 0, %11 | |
104 %26 = getelementptr inbounds %struct.img_par* %img, i32 0, i32 27, i32 undef, i32 %25 | |
105 store i32 0, i32* %26, align 4 | |
106 %27 = add nsw i32 %k.014, 1 | |
107 %28 = icmp slt i32 %27, 65 | |
108 br i1 %28, label %.preheader11, label %.loopexit | |
109 | |
110 .preheader: ; preds = %36, %9 | |
111 %k.110 = phi i32 [ %45, %36 ], [ 0, %9 ] | |
112 %coef_ctr.29 = phi i32 [ %39, %36 ], [ -1, %9 ] | |
113 br i1 false, label %29, label %30 | |
114 | |
115 ; <label>:29 ; preds = %.preheader | |
116 br label %31 | |
117 | |
118 ; <label>:30 ; preds = %.preheader | |
119 br label %31 | |
120 | |
121 ; <label>:31 ; preds = %30, %29 | |
122 %32 = getelementptr inbounds [0 x [20 x i32]]* @assignSE2partition, i32 0, i32 %1, i32 undef | |
123 %33 = load i32* %32, align 4 | |
124 %34 = getelementptr inbounds %struct.datapartition* null, i32 %33 | |
125 %35 = call i32 undef(%struct.syntaxelement* undef, %struct.img_par* %img, %struct.datapartition* %34) | |
126 br i1 false, label %.loopexit, label %36 | |
127 | |
128 ; <label>:36 ; preds = %31 | |
129 %37 = load i32* undef, align 4 | |
130 %38 = add i32 %coef_ctr.29, 1 | |
131 %39 = add i32 %38, %37 | |
132 %40 = getelementptr inbounds [2 x i8]* %7, i32 %39, i32 0 | |
133 %41 = load i8* %40, align 1 | |
134 %42 = zext i8 %41 to i32 | |
135 %43 = add nsw i32 %42, %11 | |
136 %44 = getelementptr inbounds %struct.img_par* %img, i32 0, i32 27, i32 undef, i32 %43 | |
137 store i32 0, i32* %44, align 4 | |
138 %45 = add nsw i32 %k.110, 1 | |
139 %46 = icmp slt i32 %45, 65 | |
140 br i1 %46, label %.preheader, label %.loopexit | |
141 | |
142 .loopexit: ; preds = %36, %31, %21, %15, %8 | |
143 ret void | |
144 } |