1 ; RUN: opt %loadPolly %defaultOpts -polly-codegen -enable-polly-vector -dce -S %s | FileCheck %s
2 ; Obtained from C source as:
3 ; clang -S -emit-llvm -O0 vect-reduc-1short.c
4 ; opt -correlated-propagation -mem2reg -instcombine -loop-simplify -indvars -instnamer vect-reduc-1short.s > vect-reduc-1short.ll
6 ; ModuleID = 'vect-reduc-1short.s'
7 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"
8 target triple = "x86_64-unknown-linux-gnu"
10 @ub = global [16 x i16] [i16 1, i16 3, i16 6, i16 9, i16 12, i16 15, i16 18, i16 21, i16 24, i16 27, i16 30, i16 33, i16 36, i16 39, i16 42, i16 45], align 16
11 @uc = global [16 x i16] [i16 1, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15], align 16
13 define void @main1(i16 zeroext %x, i16 zeroext %max_result, i16 zeroext %min_result) nounwind uwtable noinline {
17 for.cond: ; preds = %for.inc, %entry
18 %indvar4 = phi i64 [ %indvar.next5, %for.inc ], [ 0, %entry ]
19 %udiff.0 = phi i32 [ 2, %entry ], [ %phitmp, %for.inc ]
20 %arrayidx8 = getelementptr [16 x i16]* @uc, i64 0, i64 %indvar4
21 %arrayidx = getelementptr [16 x i16]* @ub, i64 0, i64 %indvar4
22 %exitcond6 = icmp ne i64 %indvar4, 16
23 br i1 %exitcond6, label %for.body, label %for.end
25 for.body: ; preds = %for.cond
28 for.inc: ; preds = %for.body
29 %tmp9 = load i16* %arrayidx8, align 2
30 %tmp5 = load i16* %arrayidx, align 2
31 %sub = sub i16 %tmp5, %tmp9
32 %conv12 = zext i16 %sub to i32
33 %add = add nsw i32 %udiff.0, %conv12
34 %phitmp = and i32 %add, 65535
35 %indvar.next5 = add i64 %indvar4, 1
38 for.end: ; preds = %for.cond
39 %udiff.0.lcssa = phi i32 [ %udiff.0, %for.cond ]
42 for.cond17: ; preds = %for.inc39, %for.end
43 %indvar1 = phi i64 [ %indvar.next2, %for.inc39 ], [ 0, %for.end ]
44 %umax.0 = phi i16 [ %x, %for.end ], [ %cond.in, %for.inc39 ]
45 %arrayidx26 = getelementptr [16 x i16]* @uc, i64 0, i64 %indvar1
46 %exitcond3 = icmp ne i64 %indvar1, 16
47 br i1 %exitcond3, label %for.body21, label %for.end42
49 for.body21: ; preds = %for.cond17
50 %tmp27 = load i16* %arrayidx26, align 2
51 %cmp29 = icmp ult i16 %umax.0, %tmp27
52 br i1 %cmp29, label %cond.true, label %cond.false
54 cond.true: ; preds = %for.body21
55 %tmp34 = load i16* %arrayidx26, align 2
58 cond.false: ; preds = %for.body21
61 cond.end: ; preds = %cond.false, %cond.true
62 %cond.in = phi i16 [ %tmp34, %cond.true ], [ %umax.0, %cond.false ]
65 for.inc39: ; preds = %cond.end
66 %indvar.next2 = add i64 %indvar1, 1
69 for.end42: ; preds = %for.cond17
70 %umax.0.lcssa = phi i16 [ %umax.0, %for.cond17 ]
73 for.cond43: ; preds = %for.inc69, %for.end42
74 %indvar = phi i64 [ %indvar.next, %for.inc69 ], [ 0, %for.end42 ]
75 %umin.0 = phi i16 [ %x, %for.end42 ], [ %cond67.in, %for.inc69 ]
76 %arrayidx52 = getelementptr [16 x i16]* @uc, i64 0, i64 %indvar
77 %exitcond = icmp ne i64 %indvar, 16
78 br i1 %exitcond, label %for.body47, label %for.end72
80 for.body47: ; preds = %for.cond43
81 %tmp53 = load i16* %arrayidx52, align 2
82 %cmp55 = icmp ugt i16 %umin.0, %tmp53
83 br i1 %cmp55, label %cond.true57, label %cond.false63
85 cond.true57: ; preds = %for.body47
86 %tmp61 = load i16* %arrayidx52, align 2
89 cond.false63: ; preds = %for.body47
92 cond.end66: ; preds = %cond.false63, %cond.true57
93 %cond67.in = phi i16 [ %tmp61, %cond.true57 ], [ %umin.0, %cond.false63 ]
96 for.inc69: ; preds = %cond.end66
97 %indvar.next = add i64 %indvar, 1
100 for.end72: ; preds = %for.cond43
101 %umin.0.lcssa = phi i16 [ %umin.0, %for.cond43 ]
102 %cmp75 = icmp eq i32 %udiff.0.lcssa, 242
103 br i1 %cmp75, label %if.end, label %if.then
105 if.then: ; preds = %for.end72
106 call void @abort() noreturn nounwind
109 if.end: ; preds = %for.end72
110 %cmp81 = icmp eq i16 %umax.0.lcssa, %max_result
111 br i1 %cmp81, label %if.end84, label %if.then83
113 if.then83: ; preds = %if.end
114 call void @abort() noreturn nounwind
117 if.end84: ; preds = %if.end
118 %cmp89 = icmp eq i16 %umin.0.lcssa, %min_result
119 br i1 %cmp89, label %if.end92, label %if.then91
121 if.then91: ; preds = %if.end84
122 call void @abort() noreturn nounwind
125 if.end92: ; preds = %if.end84
129 declare void @abort() noreturn
131 define i32 @main() nounwind uwtable {
133 call void @check_vect()
134 call void @main1(i16 zeroext 100, i16 zeroext 100, i16 zeroext 1)
135 call void @main1(i16 zeroext 0, i16 zeroext 15, i16 zeroext 0)
139 define internal void @check_vect() nounwind uwtable noinline {
141 %a = alloca i32, align 4
142 %b = alloca i32, align 4
143 %c = alloca i32, align 4
144 %d = alloca i32, align 4
145 %call = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* @sig_ill_handler) nounwind
146 %call1 = call i32 @__get_cpuid(i32 1, i32* %a, i32* %b, i32* %c, i32* %d)
147 %tobool = icmp eq i32 %call1, 0
148 br i1 %tobool, label %if.then, label %lor.lhs.false
150 lor.lhs.false: ; preds = %entry
151 %tmp4 = load i32* %d, align 4
152 %and6 = and i32 %tmp4, 67108864
153 %cmp = icmp eq i32 %and6, 0
154 br i1 %cmp, label %if.then, label %if.end
156 if.then: ; preds = %entry, %lor.lhs.false
157 call void @exit(i32 0) noreturn nounwind
160 if.end: ; preds = %lor.lhs.false
161 %call7 = call void (i32)* (i32, void (i32)*)* @signal(i32 4, void (i32)* null) nounwind
165 declare void (i32)* @signal(i32, void (i32)*) nounwind
167 define internal void @sig_ill_handler(i32 %sig) nounwind uwtable {
169 call void @exit(i32 0) noreturn nounwind
172 return: ; No predecessors!
176 define internal i32 @__get_cpuid(i32 %__level, i32* %__eax, i32* %__ebx, i32* %__ecx, i32* %__edx) nounwind uwtable inlinehint {
178 %and = and i32 %__level, -2147483648
179 %call = call i32 @__get_cpuid_max(i32 %and, i32* null)
180 %cmp = icmp ult i32 %call, %__level
181 br i1 %cmp, label %if.then, label %if.end
183 if.then: ; preds = %entry
186 if.end: ; preds = %entry
187 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__level) nounwind, !srcloc !0
188 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
189 %asmresult8 = extractvalue { i32, i32, i32, i32 } %tmp, 1
190 %asmresult9 = extractvalue { i32, i32, i32, i32 } %tmp, 2
191 %asmresult10 = extractvalue { i32, i32, i32, i32 } %tmp, 3
192 store i32 %asmresult, i32* %__eax, align 4
193 store i32 %asmresult8, i32* %__ebx, align 4
194 store i32 %asmresult9, i32* %__ecx, align 4
195 store i32 %asmresult10, i32* %__edx, align 4
198 return: ; preds = %if.end, %if.then
199 %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ]
203 declare void @exit(i32) noreturn
205 define internal i32 @__get_cpuid_max(i32 %__ext, i32* %__sig) nounwind uwtable inlinehint {
207 %tmp = call { i32, i32, i32, i32 } asm "cpuid\0A\09", "={ax},={bx},={cx},={dx},0,~{dirflag},~{fpsr},~{flags}"(i32 %__ext) nounwind, !srcloc !1
208 %asmresult = extractvalue { i32, i32, i32, i32 } %tmp, 0
209 %tobool = icmp eq i32* %__sig, null
210 br i1 %tobool, label %if.end, label %if.then
212 if.then: ; preds = %entry
213 %asmresult1 = extractvalue { i32, i32, i32, i32 } %tmp, 1
214 store i32 %asmresult1, i32* %__sig, align 4
217 if.end: ; preds = %entry, %if.then
221 !0 = metadata !{i32 -2147343246, i32 -2147343238}
222 !1 = metadata !{i32 -2147343369, i32 -2147343361}