[ARM] Better OR's for MVE compares
[llvm-core.git] / test / Transforms / LoopStrengthReduce / ARM / complexity.ll
blob197bb53ab517905cc7558231de7c1a099b797c37
1 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3 ; RUN: opt -mtriple=thumbv7em %s -S -loop-reduce -lsr-complexity-limit=65536 -o - | FileCheck %s
4 ; RUN: opt -mtriple=thumbv7em %s -S -loop-reduce -lsr-complexity-limit=2147483647 -o - | FileCheck %s
6 ; CHECK-LABEL: for.body12.us.us:
7 ; CHECK: [[LSR_IV6:%[^ ]+]] = phi i16* [ [[SCEVGEP7:%[^ ]+]], %for.body12.us.us ], [ [[SCEVGEP5:%[^ ]+]], %for.cond9.preheader.us.us ]
8 ; CHECK: phi i32
9 ; CHECK: [[LSR_IV:%[^ ]+]] = phi i16* [ [[SCEVGEP1:%[^ ]+]], %for.body12.us.us ], [ [[SCEVGEP:%[^ ]+]], %for.cond9.preheader.us.us ]
10 ; CHECK: phi i32
11 ; CHECK: [[SCEVGEP1]] = getelementptr i16, i16* [[LSR_IV]], i32 4
12 ; CHECK: [[SCEVGEP7]] = getelementptr i16, i16* [[LSR_IV6]], i32 4
14 define void @convolve(i16** nocapture readonly %input_image, i16** nocapture readonly %filter, i32 %filter_dim, i32 %out_width, i32 %out_height, i32** nocapture readonly %convolved) {
15 entry:
16   %cmp92 = icmp eq i32 %out_height, 0
17   br i1 %cmp92, label %for.cond.cleanup, label %for.cond1.preheader.lr.ph
19 for.cond1.preheader.lr.ph:                        ; preds = %entry
20   %xtraiter = and i32 %filter_dim, 3
21   %unroll_iter = sub i32 %filter_dim, %xtraiter
22   br label %for.cond1.preheader
24 for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
25   %res_y.093 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %add28, %for.cond.cleanup3 ]
26   %arrayidx22 = getelementptr inbounds i32*, i32** %convolved, i32 %res_y.093
27   %tmp3 = load i32*, i32** %arrayidx22, align 4
28   br label %for.cond9.preheader.us.us.preheader
30 for.cond9.preheader.us.us.preheader:              ; preds = %for.cond5.for.cond.cleanup7_crit_edge.us, %for.cond5.preheader.lr.ph
31   %res_x.060.us = phi i32 [ %add25.us, %for.cond5.for.cond.cleanup7_crit_edge.us ], [ 0, %for.cond1.preheader ]
32   br label %for.cond9.preheader.us.us
34 for.cond9.preheader.us.us:                        ; preds = %for.cond9.for.cond.cleanup11_crit_edge.us.us, %for.cond9.preheader.us.us.preheader
35   %filter_y.056.us.us = phi i32 [ %inc20.us.us, %for.cond9.for.cond.cleanup11_crit_edge.us.us.unr-lcssa ], [ 0, %for.cond9.preheader.us.us.preheader ]
36   %result_element.055.us.us = phi i32 [ %add18.us.us.3, %for.cond9.for.cond.cleanup11_crit_edge.us.us.unr-lcssa ], [ 0, %for.cond9.preheader.us.us.preheader ]
37   %add.us.us = add i32 %filter_y.056.us.us, %res_y.093
38   %arrayidx.us.us = getelementptr inbounds i16*, i16** %filter, i32 %filter_y.056.us.us
39   %tmp5 = load i16*, i16** %arrayidx.us.us, align 4
40   %arrayidx15.us.us = getelementptr inbounds i16*, i16** %input_image, i32 %add.us.us
41   %tmp6 = load i16*, i16** %arrayidx15.us.us, align 4
42   br label %for.body12.us.us
44 for.body12.us.us:                                 ; preds = %for.body12.us.us, %for.cond9.preheader.us.us
45   %filter_x.053.us.us = phi i32 [ %inc.us.us.3, %for.body12.us.us ], [ 0, %for.cond9.preheader.us.us ]
46   %result_element.152.us.us = phi i32 [ %add18.us.us.3, %for.body12.us.us ], [ %result_element.055.us.us, %for.cond9.preheader.us.us ]
47   %niter = phi i32 [ %niter.nsub.3, %for.body12.us.us ], [ %unroll_iter, %for.cond9.preheader.us.us ]
48   %add13.us.us = add i32 %filter_x.053.us.us, %res_x.060.us
49   %arrayidx14.us.us = getelementptr inbounds i16, i16* %tmp5, i32 %filter_x.053.us.us
50   %tmp9 = load i16, i16* %arrayidx14.us.us, align 2
51   %conv.us.us = sext i16 %tmp9 to i32
52   %arrayidx16.us.us = getelementptr inbounds i16, i16* %tmp6, i32 %add13.us.us
53   %tmp10 = load i16, i16* %arrayidx16.us.us, align 2
54   %conv17.us.us = sext i16 %tmp10 to i32
55   %mul.us.us = mul nsw i32 %conv17.us.us, %conv.us.us
56   %add18.us.us = add nsw i32 %mul.us.us, %result_element.152.us.us
57   %inc.us.us = or i32 %filter_x.053.us.us, 1
58   %add13.us.us.1 = add i32 %inc.us.us, %res_x.060.us
59   %arrayidx14.us.us.1 = getelementptr inbounds i16, i16* %tmp5, i32 %inc.us.us
60   %tmp11 = load i16, i16* %arrayidx14.us.us.1, align 2
61   %conv.us.us.1 = sext i16 %tmp11 to i32
62   %arrayidx16.us.us.1 = getelementptr inbounds i16, i16* %tmp6, i32 %add13.us.us.1
63   %tmp12 = load i16, i16* %arrayidx16.us.us.1, align 2
64   %conv17.us.us.1 = sext i16 %tmp12 to i32
65   %mul.us.us.1 = mul nsw i32 %conv17.us.us.1, %conv.us.us.1
66   %add18.us.us.1 = add nsw i32 %mul.us.us.1, %add18.us.us
67   %inc.us.us.1 = or i32 %filter_x.053.us.us, 2
68   %add13.us.us.2 = add i32 %inc.us.us.1, %res_x.060.us
69   %arrayidx14.us.us.2 = getelementptr inbounds i16, i16* %tmp5, i32 %inc.us.us.1
70   %tmp13 = load i16, i16* %arrayidx14.us.us.2, align 2
71   %conv.us.us.2 = sext i16 %tmp13 to i32
72   %arrayidx16.us.us.2 = getelementptr inbounds i16, i16* %tmp6, i32 %add13.us.us.2
73   %tmp14 = load i16, i16* %arrayidx16.us.us.2, align 2
74   %conv17.us.us.2 = sext i16 %tmp14 to i32
75   %mul.us.us.2 = mul nsw i32 %conv17.us.us.2, %conv.us.us.2
76   %add18.us.us.2 = add nsw i32 %mul.us.us.2, %add18.us.us.1
77   %inc.us.us.2 = or i32 %filter_x.053.us.us, 3
78   %add13.us.us.3 = add i32 %inc.us.us.2, %res_x.060.us
79   %arrayidx14.us.us.3 = getelementptr inbounds i16, i16* %tmp5, i32 %inc.us.us.2
80   %tmp15 = load i16, i16* %arrayidx14.us.us.3, align 2
81   %conv.us.us.3 = sext i16 %tmp15 to i32
82   %arrayidx16.us.us.3 = getelementptr inbounds i16, i16* %tmp6, i32 %add13.us.us.3
83   %tmp16 = load i16, i16* %arrayidx16.us.us.3, align 2
84   %conv17.us.us.3 = sext i16 %tmp16 to i32
85   %mul.us.us.3 = mul nsw i32 %conv17.us.us.3, %conv.us.us.3
86   %add18.us.us.3 = add nsw i32 %mul.us.us.3, %add18.us.us.2
87   %inc.us.us.3 = add i32 %filter_x.053.us.us, 4
88   %niter.nsub.3 = add i32 %niter, -4
89   %niter.ncmp.3 = icmp eq i32 %niter.nsub.3, 0
90   br i1 %niter.ncmp.3, label %for.cond9.for.cond.cleanup11_crit_edge.us.us.unr-lcssa, label %for.body12.us.us
92 for.cond9.for.cond.cleanup11_crit_edge.us.us.unr-lcssa: ; preds = %for.body12.us.us, %for.cond9.preheader.us.us
93   %inc20.us.us = add nuw i32 %filter_y.056.us.us, 1
94   %exitcond98 = icmp eq i32 %inc20.us.us, %filter_dim
95   br i1 %exitcond98, label %for.cond5.for.cond.cleanup7_crit_edge.us, label %for.cond9.preheader.us.us
97 for.cond5.for.cond.cleanup7_crit_edge.us:         ; preds = %for.cond9.for.cond.cleanup11_crit_edge.us.us
98   %arrayidx23.us = getelementptr inbounds i32, i32* %tmp3, i32 %res_x.060.us
99   store i32 %add18.us.us.3, i32* %arrayidx23.us, align 4
100   %add25.us = add nuw i32 %res_x.060.us, 1
101   %exitcond99 = icmp eq i32 %add25.us, %out_width
102   br i1 %exitcond99, label %for.cond.cleanup3, label %for.cond9.preheader.us.us.preheader
104 for.cond.cleanup3:                                ; preds = %for.cond5.for.cond.cleanup7_crit_edge.us, %for.cond5.preheader.preheader, %for.cond1.preheader
105   %add28 = add nuw i32 %res_y.093, 1
106   %exitcond100 = icmp eq i32 %add28, %out_height
107   br i1 %exitcond100, label %for.cond.cleanup, label %for.cond1.preheader
109 for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
110   ret void