llvm.org GIT mirror llvm / e97f84e
Simplify test cases for Atom preferring call register indirect over call memory indirect (32 and 64 bit). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178541 91177308-0d34-0410-b5e6-96231b3b80d8 Preston Gurd 7 years ago
2 changed file(s) with 148 addition(s) and 397 deletion(s). Raw diff Collapse all Expand all
0 ; RUN: llc < %s -mtriple=i386-linux-gnu -mcpu=atom 2>&1 | \
11 ; RUN: grep "calll" | not grep "("
22 ; RUN: llc < %s -mtriple=i386-linux-gnu -mcpu=core2 2>&1 | \
3 ; RUN: grep "calll" | grep "4-byte Folded Reload"
3 ; RUN: grep "calll" | grep "*funcp"
4 ;
5 ; original source code built with clang -S -emit-llvm -M32 test32.c:
6 ;
7 ; int a, b, c, d, e, f, g, h, i, j;
8 ; extern int (*funcp)(int, int, int, int, int, int, int, int);
9 ; extern int sum;
10 ;
11 ; void func()
12 ; {
13 ; sum = 0;
14 ; for( i = a; i < b; ++i )
15 ; {
16 ; sum += (*funcp)(i, b, c, d, e, f, g, h);
17 ; }
18 ; }
19 ;
20 ; ModuleID = 'test32.c'
21 target 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:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
22 target triple = "i386-unknown-linux-gnu"
423
5 %struct.targettype = type {i32}
6 %struct.op_ptr1 = type opaque
7 %struct.op_ptr2 = type opaque
8 %union.anon = type { [8 x i32], [48 x i8] }
9 %struct.const1 = type { [64 x i16], i8 }
10 %struct.const2 = type { [17 x i8], [256 x i8], i8 }
24 @sum = external global i32
25 @a = common global i32 0, align 4
26 @i = common global i32 0, align 4
27 @b = common global i32 0, align 4
28 @funcp = external global i32 (i32, i32, i32, i32, i32, i32, i32, i32)*
29 @c = common global i32 0, align 4
30 @d = common global i32 0, align 4
31 @e = common global i32 0, align 4
32 @f = common global i32 0, align 4
33 @g = common global i32 0, align 4
34 @h = common global i32 0, align 4
35 @j = common global i32 0, align 4
1136
12 %struct.ref1 = type { void (%struct.ref2*)*, i32 (%struct.ref2*)*, void (%struct.ref2*)*, i32 (%struct.ref2*, i8***)*, %struct.op_ptr2** }
13 %struct.ref2 = type { %struct.localref13*, %struct.localref15*, %struct.localref12*, i8*, i8, i32, %struct.localref11*, i32, i32, i32, i32, i32, i32, i32, double, i8, i8, i32, i8, i8, i8, i32, i8, i32, i8, i8, i8, i32, i32, i32, i32, i32, i32, i8**, i32, i32, i32, i32, i32, [64 x i32]*, [4 x %struct.const1*], [4 x %struct.const2*], [4 x %struct.const2*], i32, %struct.ref3*, i8, i8, [16 x i8], [16 x i8], [16 x i8], i32, i8, i8, i8, i8, i16, i16, i8, i8, i8, %struct.localref10*, i32, i32, i32, i32, i8*, i32, [4 x %struct.ref3*], i32, i32, i32, [10 x i32], i32, i32, i32, i32, i32, %struct.localref8*, %struct.localref9*, %struct.ref1*, %struct.localref7*, %struct.localref6*, %struct.localref5*, %struct.localref1*, %struct.ref4*, %struct.localref2*, %struct.localref3*, %struct.localref4* }
14 %struct.ref3 = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8, i32, i32, i32, i32, i32, i32, %struct.const1*, i8* }
15 %struct.ref4 = type { void (%struct.ref2*)*, [5 x void (%struct.ref2*, %struct.ref3*, i16*, i8**, i32)*] }
37 define void @func() #0 {
38 entry:
39 store i32 0, i32* @sum, align 4
40 %0 = load i32* @a, align 4
41 store i32 %0, i32* @i, align 4
42 br label %for.cond
1643
17 %struct.localref1 = type { void (%struct.ref2*)*, i8 (%struct.ref2*, [64 x i16]**)*, i8 }
18 %struct.localref2 = type { void (%struct.ref2*)*, void (%struct.ref2*, i8***, i32*, i32, i8**, i32*, i32)*, i8 }
19 %struct.localref3 = type { void (%struct.ref2*)*, void (%struct.ref2*, i8***, i32, i8**, i32)* }
20 %struct.localref4 = type { {}*, void (%struct.ref2*, i8**, i8**, i32)*, void (%struct.ref2*)*, void (%struct.ref2*)* }
21 %struct.localref5 = type { void (%struct.ref2*)*, i32 (%struct.ref2*)*, i8 (%struct.ref2*)*, i8, i8, i32, i32 }
22 %struct.localref6 = type { i32 (%struct.ref2*)*, void (%struct.ref2*)*, void (%struct.ref2*)*, void (%struct.ref2*)*, i8, i8 }
23 %struct.localref7 = type { void (%struct.ref2*, i32)*, void (%struct.ref2*, i8***, i32*, i32, i8**, i32*, i32)* }
24 %struct.localref8 = type { void (%struct.ref2*)*, void (%struct.ref2*)*, i8 }
25 %struct.localref9 = type { void (%struct.ref2*, i32)*, void (%struct.ref2*, i8**, i32*, i32)* }
26 %struct.localref10 = type { %struct.localref10*, i8, i32, i32, i8* }
27 %struct.localref11 = type { i8*, %struct.targettype, void (%struct.ref2*)*, i8 (%struct.ref2*)*, void (%struct.ref2*, %struct.targettype)*, i8 (%struct.ref2*, i32)*, void (%struct.ref2*)* }
28 %struct.localref12 = type { {}*, %struct.targettype, %struct.targettype, i32, i32 }
29 %struct.localref13 = type { void (%struct.localref14*)*, void (%struct.localref14*, i32)*, void (%struct.localref14*)*, void (%struct.localref14*, i8*)*, void (%struct.localref14*)*, i32, %union.anon, i32, %struct.targettype, i8**, i32, i8**, i32, i32 }
30 %struct.localref14 = type { %struct.localref13*, %struct.localref15*, %struct.localref12*, i8*, i8, i32 }
31 %struct.localref15 = type { i8* (%struct.localref14*, i32, %struct.targettype)*, i8* (%struct.localref14*, i32, %struct.targettype)*, i8** (%struct.localref14*, i32, i32, i32)*, [64 x i16]** (%struct.localref14*, i32, i32, i32)*, %struct.op_ptr1* (%struct.localref14*, i32, i8, i32, i32, i32)*, %struct.op_ptr2* (%struct.localref14*, i32, i8, i32, i32, i32)*, {}*, i8** (%struct.localref14*, %struct.op_ptr1*, i32, i32, i8)*, [64 x i16]** (%struct.localref14*, %struct.op_ptr2*, i32, i32, i8)*, void (%struct.localref14*, i32)*, {}*, %struct.targettype, %struct.targettype}
44 for.cond: ; preds = %for.inc, %entry
45 %1 = load i32* @i, align 4
46 %2 = load i32* @b, align 4
47 %cmp = icmp slt i32 %1, %2
48 br i1 %cmp, label %for.body, label %for.end
3249
33 define internal i32 @foldedreload(%struct.ref2* %cinfo, i8*** nocapture %output1) {
34 %1 = getelementptr inbounds %struct.ref2* %cinfo, i32 0, i32 79
35 %2 = load %struct.ref1** %1, align 4
36 %3 = getelementptr inbounds %struct.ref2* %cinfo, i32 0, i32 68
37 %4 = load i32* %3, align 4
38 %5 = add i32 %4, -1
39 %6 = getelementptr inbounds %struct.ref2* %cinfo, i32 0, i32 64
40 %7 = load i32* %6, align 4
41 %8 = add i32 %7, -1
42 %9 = getelementptr inbounds %struct.ref1* %2, i32 1, i32 1
43 %10 = bitcast i32 (%struct.ref2*)** %9 to i32*
44 %11 = load i32* %10, align 4
45 %12 = getelementptr inbounds %struct.ref1* %2, i32 1, i32 2
46 %13 = bitcast void (%struct.ref2*)** %12 to i32*
47 %14 = load i32* %13, align 4
48 %15 = icmp slt i32 %11, %14
49 br i1 %15, label %.lr.ph18, label %._crit_edge19
50 for.body: ; preds = %for.cond
51 %3 = load i32 (i32, i32, i32, i32, i32, i32, i32, i32)** @funcp, align 4
52 %4 = load i32* @i, align 4
53 %5 = load i32* @b, align 4
54 %6 = load i32* @c, align 4
55 %7 = load i32* @d, align 4
56 %8 = load i32* @e, align 4
57 %9 = load i32* @f, align 4
58 %10 = load i32* @g, align 4
59 %11 = load i32* @h, align 4
60 %call = call i32 %3(i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11)
61 %12 = load i32* @sum, align 4
62 %add = add nsw i32 %12, %call
63 store i32 %add, i32* @sum, align 4
64 br label %for.inc
5065
51 .lr.ph18:
52 %16 = getelementptr inbounds %struct.ref1* %2, i32 1
53 %17 = bitcast %struct.ref1* %16 to i32*
54 %18 = getelementptr inbounds %struct.ref1* %16, i32 0, i32 0
55 %19 = getelementptr inbounds %struct.ref2* %cinfo, i32 0, i32 66
56 %20 = getelementptr inbounds %struct.ref2* %cinfo, i32 0, i32 84
57 %21 = getelementptr inbounds %struct.ref2* %cinfo, i32 0, i32 36
58 %22 = getelementptr inbounds %struct.ref1* %2, i32 1, i32 3
59 %23 = bitcast i32 (%struct.ref2*, i8***)** %22 to [10 x [64 x i16]*]*
60 %.pre = load i32* %17, align 4
61 br label %24
66 for.inc: ; preds = %for.body
67 %13 = load i32* @i, align 4
68 %inc = add nsw i32 %13, 1
69 store i32 %inc, i32* @i, align 4
70 br label %for.cond
6271
63 ;
64 %25 = phi i32 [ %14, %.lr.ph18 ], [ %89, %88 ]
65 %26 = phi i32 [ %.pre, %.lr.ph18 ], [ 0, %88 ]
66 %var1.015 = phi i32 [ %11, %.lr.ph18 ], [ %90, %88 ]
67 %27 = icmp ugt i32 %26, %5
68 br i1 %27, label %88, label %.preheader7.lr.ph
72 for.end: ; preds = %for.cond
73 ret void
74 }
6975
70 .preheader7.lr.ph:
71 %.pre24 = load i32* %19, align 4
72 br label %.preheader7
73
74 .preheader7:
75 %28 = phi i32 [ %.pre24, %.preheader7.lr.ph ], [ %85, %._crit_edge11 ]
76 %var2.012 = phi i32 [ %26, %.preheader7.lr.ph ], [ %86, %._crit_edge11 ]
77 %29 = icmp sgt i32 %28, 0
78 br i1 %29, label %.lr.ph10, label %._crit_edge11
79
80 .lr.ph10:
81 %30 = phi i32 [ %28, %.preheader7 ], [ %82, %81 ]
82 %var4.09 = phi i32 [ 0, %.preheader7 ], [ %var4.1.lcssa, %81 ]
83 %ci.08 = phi i32 [ 0, %.preheader7 ], [ %83, %81 ]
84 %31 = getelementptr inbounds %struct.ref2* %cinfo, i32 0, i32 67, i32 %ci.08
85 %32 = load %struct.ref3** %31, align 4
86 %33 = getelementptr inbounds %struct.ref3* %32, i32 0, i32 1
87 %34 = load i32* %33, align 4
88 %35 = load %struct.ref4** %20, align 4
89 %36 = getelementptr inbounds %struct.ref4* %35, i32 0, i32 1, i32 %34
90 %37 = load void (%struct.ref2*, %struct.ref3*, i16*, i8**, i32)** %36, align 4
91 %38 = getelementptr inbounds %struct.ref3* %32, i32 0, i32 17
92 %39 = load i32* %38, align 4
93 %40 = getelementptr inbounds %struct.ref3* %32, i32 0, i32 9
94 %41 = load i32* %40, align 4
95 %42 = getelementptr inbounds %struct.ref3* %32, i32 0, i32 16
96 %43 = load i32* %42, align 4
97 %44 = mul i32 %43, %var2.012
98 %45 = getelementptr inbounds %struct.ref3* %32, i32 0, i32 14
99 %46 = load i32* %45, align 4
100 %47 = icmp sgt i32 %46, 0
101 br i1 %47, label %.lr.ph6, label %81
102
103 .lr.ph6:
104 %48 = getelementptr inbounds i8*** %output1, i32 %34
105 %49 = mul nsw i32 %41, %var1.015
106 %50 = load i8*** %48, align 4
107 %51 = getelementptr inbounds i8** %50, i32 %49
108 %52 = getelementptr inbounds %struct.ref3* %32, i32 0, i32 13
109 %53 = getelementptr inbounds %struct.ref3* %32, i32 0, i32 18
110 %54 = icmp sgt i32 %39, 0
111 br i1 %54, label %.lr.ph6.split.us, label %.lr.ph6..lr.ph6.split_crit_edge
112
113 .lr.ph6..lr.ph6.split_crit_edge:
114 br label %._crit_edge26
115
116 .lr.ph6.split.us:
117 %55 = phi i32 [ %63, %._crit_edge28 ], [ %46, %.lr.ph6 ]
118 %56 = phi i32 [ %64, %._crit_edge28 ], [ %41, %.lr.ph6 ]
119 %var4.15.us = phi i32 [ %66, %._crit_edge28 ], [ %var4.09, %.lr.ph6 ]
120 %output2.04.us = phi i8** [ %69, %._crit_edge28 ], [ %51, %.lr.ph6 ]
121 %var5.03.us = phi i32 [ %67, %._crit_edge28 ], [ 0, %.lr.ph6 ]
122 %57 = load i32* %21, align 4
123 %58 = icmp ult i32 %57, %8
124 br i1 %58, label %.lr.ph.us, label %59
125
126 ;
127 %60 = add nsw i32 %var5.03.us, %var1.015
128 %61 = load i32* %53, align 4
129 %62 = icmp slt i32 %60, %61
130 br i1 %62, label %.lr.ph.us, label %._crit_edge27
131
132 ._crit_edge27:
133 %63 = phi i32 [ %.pre23.pre, %.loopexit.us ], [ %55, %59 ]
134 %64 = phi i32 [ %74, %.loopexit.us ], [ %56, %59 ]
135 %65 = load i32* %52, align 4
136 %66 = add nsw i32 %65, %var4.15.us
137 %67 = add nsw i32 %var5.03.us, 1
138 %68 = icmp slt i32 %67, %63
139 br i1 %68, label %._crit_edge28, label %._crit_edge
140
141 ._crit_edge28:
142 %69 = getelementptr inbounds i8** %output2.04.us, i32 %64
143 br label %.lr.ph6.split.us
144
145 .lr.ph.us:
146 %var3.02.us = phi i32 [ %75, %.lr.ph.us ], [ %44, %.lr.ph6.split.us ], [ %44, %59 ]
147 %xindex.01.us = phi i32 [ %76, %.lr.ph.us ], [ 0, %.lr.ph6.split.us ], [ 0, %59 ]
148 %70 = add nsw i32 %xindex.01.us, %var4.15.us
149 %71 = getelementptr inbounds [10 x [64 x i16]*]* %23, i32 0, i32 %70
150 %72 = load [64 x i16]** %71, align 4
151 %73 = getelementptr inbounds [64 x i16]* %72, i32 0, i32 0
152 tail call void %37(%struct.ref2* %cinfo, %struct.ref3* %32, i16* %73, i8** %output2.04.us, i32 %var3.02.us) nounwind
153 %74 = load i32* %40, align 4
154 %75 = add i32 %74, %var3.02.us
155 %76 = add nsw i32 %xindex.01.us, 1
156 %exitcond = icmp eq i32 %76, %39
157 br i1 %exitcond, label %.loopexit.us, label %.lr.ph.us
158
159 .loopexit.us:
160 %.pre23.pre = load i32* %45, align 4
161 br label %._crit_edge27
162
163 ._crit_edge26:
164 %var4.15 = phi i32 [ %var4.09, %.lr.ph6..lr.ph6.split_crit_edge ], [ %78, %._crit_edge26 ]
165 %var5.03 = phi i32 [ 0, %.lr.ph6..lr.ph6.split_crit_edge ], [ %79, %._crit_edge26 ]
166 %77 = load i32* %52, align 4
167 %78 = add nsw i32 %77, %var4.15
168 %79 = add nsw i32 %var5.03, 1
169 %80 = icmp slt i32 %79, %46
170 br i1 %80, label %._crit_edge26, label %._crit_edge
171
172 ._crit_edge:
173 %split = phi i32 [ %66, %._crit_edge27 ], [ %78, %._crit_edge26 ]
174 %.pre25 = load i32* %19, align 4
175 br label %81
176
177 ;
178 %82 = phi i32 [ %.pre25, %._crit_edge ], [ %30, %.lr.ph10 ]
179 %var4.1.lcssa = phi i32 [ %split, %._crit_edge ], [ %var4.09, %.lr.ph10 ]
180 %83 = add nsw i32 %ci.08, 1
181 %84 = icmp slt i32 %83, %82
182 br i1 %84, label %.lr.ph10, label %._crit_edge11
183
184 ._crit_edge11:
185 %85 = phi i32 [ %28, %.preheader7 ], [ %82, %81 ]
186 %86 = add i32 %var2.012, 1
187 %87 = icmp ugt i32 %86, %5
188 br i1 %87, label %._crit_edge14, label %.preheader7
189
190 ._crit_edge14:
191 %.pre21 = load i32* %13, align 4
192 br label %88
193
194 ;
195 %89 = phi i32 [ %.pre21, %._crit_edge14 ], [ %25, %24 ]
196 store void (%struct.ref2*)* null, void (%struct.ref2*)** %18, align 4
197 %90 = add nsw i32 %var1.015, 1
198 %91 = icmp slt i32 %90, %89
199 br i1 %91, label %24, label %._crit_edge19
200
201 ._crit_edge19:
202 ret i32 3
203 }
76 attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
0 ; RUN: llc < %s -mtriple=x86_64-linux-gnu -mcpu=atom 2>&1 | \
11 ; RUN: grep "callq" | not grep "("
22 ; RUN: llc < %s -mtriple=x86_64-linux-gnu -mcpu=core2 2>&1 | \
3 ; RUN: grep "callq" | grep "8-byte Folded Reload"
3 ; RUN: grep "callq" | grep "*funcp"
4 ;
5 ; Original source code built with clang -S -emit-llvm -m64 test64.c:
6 ; int a, b, c, d, e, f, g, h, i, j, k, l, m, n;
7 ; extern int (*funcp)(int, int, int, int, int, int,
8 ; int, int, int, int, int, int,
9 ; int, int);
10 ; extern int sum;
11 ;
12 ; void func()
13 ; {
14 ; sum = 0;
15 ; for( i = a; i < b; ++i )
16 ; {
17 ; sum += (*funcp)(a, i, i*2, i/b, c, d, e, f, g, h, j, k, l, n);
18 ; }
19 ; }
20 ;
21 ; ModuleID = 'test64.c'
22 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
23 target triple = "x86_64-unknown-linux-gnu"
424
5 %struct.targettype = type {i64}
6 %struct.op_ptr1 = type opaque
7 %struct.op_ptr2 = type opaque
8 %union.anon = type { [8 x i32], [48 x i8] }
9 %struct.const1 = type { [64 x i16], i8 }
10 %struct.const2 = type { [17 x i8], [256 x i8], i8 }
11 %struct.coef1 = type { %struct.ref1, i32, i32, i32, [10 x [64 x i16]*] }
25 @sum = external global i32
26 @a = common global i32 0, align 4
27 @i = common global i32 0, align 4
28 @b = common global i32 0, align 4
29 @funcp = external global i32 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32)*
30 @c = common global i32 0, align 4
31 @d = common global i32 0, align 4
32 @e = common global i32 0, align 4
33 @f = common global i32 0, align 4
34 @g = common global i32 0, align 4
35 @h = common global i32 0, align 4
36 @j = common global i32 0, align 4
37 @k = common global i32 0, align 4
38 @l = common global i32 0, align 4
39 @n = common global i32 0, align 4
40 @m = common global i32 0, align 4
1241
13 %struct.ref1 = type { void (%struct.ref2*)*, i32 (%struct.ref2*)*, void (%struct.ref2*)*, i32 (%struct.ref2*, i8***)*, %struct.op_ptr2** }
14 %struct.ref2 = type { %struct.localref13*, %struct.localref15*, %struct.localref12*, i8*, i8, i32, %struct.localref11*, i32, i32, i32, i32, i32, i32, i32, double, i8, i8, i32, i8, i8, i8, i32, i8, i32, i8, i8, i8, i32, i32, i32, i32, i32, i32, i8**, i32, i32, i32, i32, i32, [64 x i32]*, [4 x %struct.const1*], [4 x %struct.const2*], [4 x %struct.const2*], i32, %struct.ref3*, i8, i8, [16 x i8], [16 x i8], [16 x i8], i32, i8, i8, i8, i8, i16, i16, i8, i8, i8, %struct.localref10*, i32, i32, i32, i32, i8*, i32, [4 x %struct.ref3*], i32, i32, i32, [10 x i32], i32, i32, i32, i32, i32, %struct.localref8*, %struct.localref9*, %struct.ref1*, %struct.localref7*, %struct.localref6*, %struct.localref5*, %struct.localref1*, %struct.ref4*, %struct.localref2*, %struct.localref3*, %struct.localref4* }
15 %struct.ref3 = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8, i32, i32, i32, i32, i32, i32, %struct.const1*, i8* }
16 %struct.ref4 = type { void (%struct.ref2*)*, [5 x void (%struct.ref2*, %struct.ref3*, i16*, i8**, i32)*] }
42 define void @func() #0 {
43 entry:
44 store i32 0, i32* @sum, align 4
45 %0 = load i32* @a, align 4
46 store i32 %0, i32* @i, align 4
47 br label %for.cond
1748
18 %struct.localref1 = type { void (%struct.ref2*)*, i8 (%struct.ref2*, [64 x i16]**)*, i8 }
19 %struct.localref2 = type { void (%struct.ref2*)*, void (%struct.ref2*, i8***, i32*, i32, i8**, i32*, i32)*, i8 }
20 %struct.localref3 = type { void (%struct.ref2*)*, void (%struct.ref2*, i8***, i32, i8**, i32)* }
21 %struct.localref4 = type { {}*, void (%struct.ref2*, i8**, i8**, i32)*, void (%struct.ref2*)*, void (%struct.ref2*)* }
22 %struct.localref5 = type { void (%struct.ref2*)*, i32 (%struct.ref2*)*, i8 (%struct.ref2*)*, i8, i8, i32, i32 }
23 %struct.localref6 = type { i32 (%struct.ref2*)*, void (%struct.ref2*)*, void (%struct.ref2*)*, void (%struct.ref2*)*, i8, i8 }
24 %struct.localref7 = type { void (%struct.ref2*, i32)*, void (%struct.ref2*, i8***, i32*, i32, i8**, i32*, i32)* }
25 %struct.localref8 = type { void (%struct.ref2*)*, void (%struct.ref2*)*, i8 }
26 %struct.localref9 = type { void (%struct.ref2*, i32)*, void (%struct.ref2*, i8**, i32*, i32)* }
27 %struct.localref10 = type { %struct.localref10*, i8, i32, i32, i8* }
28 %struct.localref11 = type { i8*, %struct.targettype, void (%struct.ref2*)*, i8 (%struct.ref2*)*, void (%struct.ref2*, %struct.targettype)*, i8 (%struct.ref2*, i32)*, void (%struct.ref2*)* }
29 %struct.localref12 = type { {}*, %struct.targettype, %struct.targettype, i32, i32 }
30 %struct.localref13 = type { void (%struct.localref14*)*, void (%struct.localref14*, i32)*, void (%struct.localref14*)*, void (%struct.localref14*, i8*)*, void (%struct.localref14*)*, i32, %union.anon, i32, %struct.targettype, i8**, i32, i8**, i32, i32 }
31 %struct.localref14 = type { %struct.localref13*, %struct.localref15*, %struct.localref12*, i8*, i8, i32 }
32 %struct.localref15 = type { i8* (%struct.localref14*, i32, %struct.targettype)*, i8* (%struct.localref14*, i32, %struct.targettype)*, i8** (%struct.localref14*, i32, i32, i32)*, [64 x i16]** (%struct.localref14*, i32, i32, i32)*, %struct.op_ptr1* (%struct.localref14*, i32, i8, i32, i32, i32)*, %struct.op_ptr2* (%struct.localref14*, i32, i8, i32, i32, i32)*, {}*, i8** (%struct.localref14*, %struct.op_ptr1*, i32, i32, i8)*, [64 x i16]** (%struct.localref14*, %struct.op_ptr2*, i32, i32, i8)*, void (%struct.localref14*, i32)*, {}*, %struct.targettype, %struct.targettype}
49 for.cond: ; preds = %for.inc, %entry
50 %1 = load i32* @i, align 4
51 %2 = load i32* @b, align 4
52 %cmp = icmp slt i32 %1, %2
53 br i1 %cmp, label %for.body, label %for.end
3354
34 define internal i32 @foldedreload(%struct.ref2* %cinfo, i8*** nocapture %output1) {
35 %1 = getelementptr inbounds %struct.ref2* %cinfo, i64 0, i32 79
36 %2 = load %struct.ref1** %1, align 8
37 %3 = bitcast %struct.ref1* %2 to %struct.coef1*
38 %4 = getelementptr inbounds %struct.ref2* %cinfo, i64 0, i32 68
39 %5 = load i32* %4, align 4
40 %6 = add i32 %5, -1
41 %7 = getelementptr inbounds %struct.ref2* %cinfo, i64 0, i32 64
42 %8 = load i32* %7, align 4
43 %9 = add i32 %8, -1
44 %10 = getelementptr inbounds %struct.coef1* %3, i64 0, i32 2
45 %11 = load i32* %10, align 4
46 %12 = getelementptr inbounds %struct.ref1* %2, i64 1, i32 1
47 %13 = bitcast i32 (%struct.ref2*)** %12 to i32*
48 %14 = load i32* %13, align 4
49 %15 = icmp slt i32 %11, %14
50 br i1 %15, label %.lr.ph18, label %._crit_edge19
55 for.body: ; preds = %for.cond
56 %3 = load i32 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32)** @funcp, align 8
57 %4 = load i32* @a, align 4
58 %5 = load i32* @i, align 4
59 %6 = load i32* @i, align 4
60 %mul = mul nsw i32 %6, 2
61 %7 = load i32* @i, align 4
62 %8 = load i32* @b, align 4
63 %div = sdiv i32 %7, %8
64 %9 = load i32* @c, align 4
65 %10 = load i32* @d, align 4
66 %11 = load i32* @e, align 4
67 %12 = load i32* @f, align 4
68 %13 = load i32* @g, align 4
69 %14 = load i32* @h, align 4
70 %15 = load i32* @j, align 4
71 %16 = load i32* @k, align 4
72 %17 = load i32* @l, align 4
73 %18 = load i32* @n, align 4
74 %call = call i32 %3(i32 %4, i32 %5, i32 %mul, i32 %div, i32 %9, i32 %10, i32 %11, i32 %12, i32 %13, i32 %14, i32 %15, i32 %16, i32 %17, i32 %18)
75 %19 = load i32* @sum, align 4
76 %add = add nsw i32 %19, %call
77 store i32 %add, i32* @sum, align 4
78 br label %for.inc
5179
52 .lr.ph18:
53 %16 = getelementptr inbounds %struct.ref1* %2, i64 1
54 %17 = bitcast %struct.ref1* %16 to i32*
55 %18 = getelementptr inbounds %struct.ref2* %cinfo, i64 0, i32 66
56 %19 = getelementptr inbounds %struct.ref2* %cinfo, i64 0, i32 84
57 %20 = getelementptr inbounds %struct.ref2* %cinfo, i64 0, i32 36
58 %21 = getelementptr inbounds %struct.ref1* %2, i64 1, i32 2
59 %22 = bitcast void (%struct.ref2*)** %21 to [10 x [64 x i16]*]*
60 %.pre = load i32* %17, align 4
61 br label %23
80 for.inc: ; preds = %for.body
81 %20 = load i32* @i, align 4
82 %inc = add nsw i32 %20, 1
83 store i32 %inc, i32* @i, align 4
84 br label %for.cond
6285
63 ;
64 %24 = phi i32 [ %14, %.lr.ph18 ], [ %92, %91 ]
65 %25 = phi i32 [ %.pre, %.lr.ph18 ], [ 0, %91 ]
66 %var1.015 = phi i32 [ %11, %.lr.ph18 ], [ %93, %91 ]
67 %26 = icmp ugt i32 %25, %6
68 br i1 %26, label %91, label %.preheader7.lr.ph
86 for.end: ; preds = %for.cond
87 ret void
88 }
6989
70 .preheader7.lr.ph:
71 %.pre24 = load i32* %18, align 4
72 br label %.preheader7
73
74 .preheader7:
75 %27 = phi i32 [ %.pre24, %.preheader7.lr.ph ], [ %88, %._crit_edge11 ]
76 %var2.012 = phi i32 [ %25, %.preheader7.lr.ph ], [ %89, %._crit_edge11 ]
77 %28 = icmp sgt i32 %27, 0
78 br i1 %28, label %.lr.ph10, label %._crit_edge11
79
80 .lr.ph10:
81 %29 = phi i32 [ %27, %.preheader7 ], [ %85, %84 ]
82 %indvars.iv21 = phi i64 [ 0, %.preheader7 ], [ %indvars.iv.next22, %84 ]
83 %var4.09 = phi i32 [ 0, %.preheader7 ], [ %var4.1.lcssa, %84 ]
84 %30 = getelementptr inbounds %struct.ref2* %cinfo, i64 0, i32 67, i64 %indvars.iv21
85 %31 = load %struct.ref3** %30, align 8
86 %32 = getelementptr inbounds %struct.ref3* %31, i64 0, i32 1
87 %33 = load i32* %32, align 4
88 %34 = sext i32 %33 to i64
89 %35 = load %struct.ref4** %19, align 8
90 %36 = getelementptr inbounds %struct.ref4* %35, i64 0, i32 1, i64 %34
91 %37 = load void (%struct.ref2*, %struct.ref3*, i16*, i8**, i32)** %36, align 8
92 %38 = getelementptr inbounds %struct.ref3* %31, i64 0, i32 17
93 %39 = load i32* %38, align 4
94 %40 = getelementptr inbounds %struct.ref3* %31, i64 0, i32 9
95 %41 = load i32* %40, align 4
96 %42 = getelementptr inbounds %struct.ref3* %31, i64 0, i32 16
97 %43 = load i32* %42, align 4
98 %44 = mul i32 %43, %var2.012
99 %45 = getelementptr inbounds %struct.ref3* %31, i64 0, i32 14
100 %46 = load i32* %45, align 4
101 %47 = icmp sgt i32 %46, 0
102 br i1 %47, label %.lr.ph6, label %84
103
104 .lr.ph6:
105 %48 = mul nsw i32 %41, %var1.015
106 %49 = getelementptr inbounds i8*** %output1, i64 %34
107 %50 = sext i32 %48 to i64
108 %51 = load i8*** %49, align 8
109 %52 = getelementptr inbounds i8** %51, i64 %50
110 %53 = getelementptr inbounds %struct.ref3* %31, i64 0, i32 13
111 %54 = getelementptr inbounds %struct.ref3* %31, i64 0, i32 18
112 %55 = icmp sgt i32 %39, 0
113 br i1 %55, label %.lr.ph6.split.us, label %.lr.ph6..lr.ph6.split_crit_edge
114
115 .lr.ph6..lr.ph6.split_crit_edge:
116 br label %._crit_edge28
117
118 .lr.ph6.split.us:
119 %56 = phi i32 [ %64, %._crit_edge30 ], [ %46, %.lr.ph6 ]
120 %57 = phi i32 [ %65, %._crit_edge30 ], [ %41, %.lr.ph6 ]
121 %var4.15.us = phi i32 [ %67, %._crit_edge30 ], [ %var4.09, %.lr.ph6 ]
122 %output2.04.us = phi i8** [ %71, %._crit_edge30 ], [ %52, %.lr.ph6 ]
123 %var5.03.us = phi i32 [ %68, %._crit_edge30 ], [ 0, %.lr.ph6 ]
124 %58 = load i32* %20, align 4
125 %59 = icmp ult i32 %58, %9
126 br i1 %59, label %.lr.ph.us, label %60
127
128 ;
129 %61 = add nsw i32 %var5.03.us, %var1.015
130 %62 = load i32* %54, align 4
131 %63 = icmp slt i32 %61, %62
132 br i1 %63, label %.lr.ph.us, label %._crit_edge29
133
134 ._crit_edge29:
135 %64 = phi i32 [ %.pre25.pre, %.loopexit.us ], [ %56, %60 ]
136 %65 = phi i32 [ %77, %.loopexit.us ], [ %57, %60 ]
137 %66 = load i32* %53, align 4
138 %67 = add nsw i32 %66, %var4.15.us
139 %68 = add nsw i32 %var5.03.us, 1
140 %69 = icmp slt i32 %68, %64
141 br i1 %69, label %._crit_edge30, label %._crit_edge
142
143 ._crit_edge30:
144 %70 = sext i32 %65 to i64
145 %71 = getelementptr inbounds i8** %output2.04.us, i64 %70
146 br label %.lr.ph6.split.us
147
148 ;
149 %indvars.iv = phi i64 [ 0, %.lr.ph.us ], [ %indvars.iv.next, %72 ]
150 %var3.02.us = phi i32 [ %44, %.lr.ph.us ], [ %78, %72 ]
151 %73 = add nsw i64 %indvars.iv, %79
152 %74 = getelementptr inbounds [10 x [64 x i16]*]* %22, i64 0, i64 %73
153 %75 = load [64 x i16]** %74, align 8
154 %76 = getelementptr inbounds [64 x i16]* %75, i64 0, i64 0
155 tail call void %37(%struct.ref2* %cinfo, %struct.ref3* %31, i16* %76, i8** %output2.04.us, i32 %var3.02.us) nounwind
156 %77 = load i32* %40, align 4
157 %78 = add i32 %77, %var3.02.us
158 %indvars.iv.next = add i64 %indvars.iv, 1
159 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
160 %exitcond = icmp eq i32 %lftr.wideiv, %39
161 br i1 %exitcond, label %.loopexit.us, label %72
162
163 .loopexit.us:
164 %.pre25.pre = load i32* %45, align 4
165 br label %._crit_edge29
166
167 .lr.ph.us:
168 %79 = sext i32 %var4.15.us to i64
169 br label %72
170
171 ._crit_edge28:
172 %var4.15 = phi i32 [ %var4.09, %.lr.ph6..lr.ph6.split_crit_edge ], [ %81, %._crit_edge28 ]
173 %var5.03 = phi i32 [ 0, %.lr.ph6..lr.ph6.split_crit_edge ], [ %82, %._crit_edge28 ]
174 %80 = load i32* %53, align 4
175 %81 = add nsw i32 %80, %var4.15
176 %82 = add nsw i32 %var5.03, 1
177 %83 = icmp slt i32 %82, %46
178 br i1 %83, label %._crit_edge28, label %._crit_edge
179
180 ._crit_edge:
181 %split = phi i32 [ %67, %._crit_edge29 ], [ %81, %._crit_edge28 ]
182 %.pre27 = load i32* %18, align 4
183 br label %84
184
185 ;
186 %85 = phi i32 [ %.pre27, %._crit_edge ], [ %29, %.lr.ph10 ]
187 %var4.1.lcssa = phi i32 [ %split, %._crit_edge ], [ %var4.09, %.lr.ph10 ]
188 %indvars.iv.next22 = add i64 %indvars.iv21, 1
189 %86 = trunc i64 %indvars.iv.next22 to i32
190 %87 = icmp slt i32 %86, %85
191 br i1 %87, label %.lr.ph10, label %._crit_edge11
192
193 ._crit_edge11:
194 %88 = phi i32 [ %27, %.preheader7 ], [ %85, %84 ]
195 %89 = add i32 %var2.012, 1
196 %90 = icmp ugt i32 %89, %6
197 br i1 %90, label %._crit_edge14, label %.preheader7
198
199 ._crit_edge14:
200 %.pre23 = load i32* %13, align 4
201 br label %91
202
203 ;
204 %92 = phi i32 [ %.pre23, %._crit_edge14 ], [ %24, %23 ]
205 store i32 0, i32* %17, align 4
206 %93 = add nsw i32 %var1.015, 1
207 %94 = icmp slt i32 %93, %92
208 br i1 %94, label %23, label %._crit_edge19
209
210 ._crit_edge19:
211 ret i32 3
212 }
90 attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }