xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/ARM/select-costs.ll (revision 8979ae42769e529b0f6fce3268492ffb49bd54b9)
1ed48e6faSSam Parker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2d1d12935SRoman Lebedev; RUN: opt -mtriple=thumbv8.1m.main -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s -o - | FileCheck %s --check-prefix=V8M
3d1d12935SRoman Lebedev; RUN: opt -mtriple=thumbv8m.main -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s -o - | FileCheck %s --check-prefix=V8M
4d1d12935SRoman Lebedev; RUN: opt -mtriple=thumbv8m.base -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s -o - | FileCheck %s --check-prefix=V8M
5d1d12935SRoman Lebedev; RUN: opt -mtriple=armv8a -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s -o - | FileCheck %s --check-prefix=V8A
6ed48e6faSSam Parker
7ed48e6faSSam Parker; Test that the phis from for.inc.preheader aren't hoisted into sw.bb92 because
8ed48e6faSSam Parker; the cost is too great - we can make a better decision later on.
947251582SSam Parker; FIXME: The Arm cost model needs to be updated for SizeAndLatency.
10*8979ae42SNikita Popovdefine i32 @multiple_spec_select_costs(ptr %a, ptr %idx, i8 %in) {
11ed48e6faSSam Parker; V8M-LABEL: @multiple_spec_select_costs(
12ed48e6faSSam Parker; V8M-NEXT:  entry:
13*8979ae42SNikita Popov; V8M-NEXT:    [[GEP_A_2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i32 2
14*8979ae42SNikita Popov; V8M-NEXT:    [[INCDEC_PTR109_C4:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 3
15ed48e6faSSam Parker; V8M-NEXT:    [[ZERO:%.*]] = icmp ne i8 [[IN:%.*]], 0
16ed48e6faSSam Parker; V8M-NEXT:    br i1 [[ZERO]], label [[FOR_INC_PREHEADER:%.*]], label [[SW_BB92:%.*]]
17ed48e6faSSam Parker; V8M:       sw.bb92:
18ed48e6faSSam Parker; V8M-NEXT:    [[C_OFF_I150:%.*]] = add i8 [[IN]], -48
19ed48e6faSSam Parker; V8M-NEXT:    [[UGT_9:%.*]] = icmp ugt i8 [[C_OFF_I150]], 9
20ed48e6faSSam Parker; V8M-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[UGT_9]], i1 false, i1 true
21ed48e6faSSam Parker; V8M-NEXT:    [[SPEC_SELECT1:%.*]] = select i1 [[UGT_9]], i32 1, i32 7
22ed48e6faSSam Parker; V8M-NEXT:    br label [[FOR_INC_PREHEADER]]
23ed48e6faSSam Parker; V8M:       for.inc.preheader:
24*8979ae42SNikita Popov; V8M-NEXT:    [[STR_PH_0:%.*]] = phi ptr [ [[GEP_A_2]], [[ENTRY:%.*]] ], [ [[INCDEC_PTR109_C4]], [[SW_BB92]] ]
25ed48e6faSSam Parker; V8M-NEXT:    [[CMP:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[SPEC_SELECT]], [[SW_BB92]] ]
26ed48e6faSSam Parker; V8M-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[SPEC_SELECT1]], [[SW_BB92]] ]
27ed48e6faSSam Parker; V8M-NEXT:    br label [[FOR_INC:%.*]]
28ed48e6faSSam Parker; V8M:       for.inc:
29*8979ae42SNikita Popov; V8M-NEXT:    [[STR_PH_1:%.*]] = phi ptr [ [[INCDEC_PTR109:%.*]], [[FOR_BODY:%.*]] ], [ [[STR_PH_0]], [[FOR_INC_PREHEADER]] ]
30*8979ae42SNikita Popov; V8M-NEXT:    [[INCDEC_PTR109]] = getelementptr inbounds i8, ptr [[STR_PH_1]], i32 1
31*8979ae42SNikita Popov; V8M-NEXT:    [[LOAD_1:%.*]] = load i8, ptr [[INCDEC_PTR109]], align 1
32ed48e6faSSam Parker; V8M-NEXT:    [[TOBOOL:%.*]] = icmp ne i8 [[LOAD_1]], 0
33ed48e6faSSam Parker; V8M-NEXT:    [[AND:%.*]] = and i1 [[CMP]], [[TOBOOL]]
34ed48e6faSSam Parker; V8M-NEXT:    br i1 [[AND]], label [[FOR_BODY]], label [[EXIT:%.*]]
35ed48e6faSSam Parker; V8M:       for.body:
36ed48e6faSSam Parker; V8M-NEXT:    [[CMP_1:%.*]] = icmp eq i8 [[LOAD_1]], 1
37ed48e6faSSam Parker; V8M-NEXT:    br i1 [[CMP_1]], label [[FOR_INC]], label [[SW_BB92]]
38ed48e6faSSam Parker; V8M:       exit:
39ed48e6faSSam Parker; V8M-NEXT:    ret i32 [[PHI_RES]]
40ed48e6faSSam Parker;
41ed48e6faSSam Parker; V8A-LABEL: @multiple_spec_select_costs(
42ed48e6faSSam Parker; V8A-NEXT:  entry:
43*8979ae42SNikita Popov; V8A-NEXT:    [[GEP_A_2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i32 2
44*8979ae42SNikita Popov; V8A-NEXT:    [[INCDEC_PTR109_C4:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 3
45ed48e6faSSam Parker; V8A-NEXT:    [[ZERO:%.*]] = icmp ne i8 [[IN:%.*]], 0
46ed48e6faSSam Parker; V8A-NEXT:    br i1 [[ZERO]], label [[FOR_INC_PREHEADER:%.*]], label [[SW_BB92:%.*]]
47ed48e6faSSam Parker; V8A:       sw.bb92:
48ed48e6faSSam Parker; V8A-NEXT:    [[C_OFF_I150:%.*]] = add i8 [[IN]], -48
49ed48e6faSSam Parker; V8A-NEXT:    [[UGT_9:%.*]] = icmp ugt i8 [[C_OFF_I150]], 9
50ed48e6faSSam Parker; V8A-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[UGT_9]], i1 false, i1 true
51ed48e6faSSam Parker; V8A-NEXT:    [[SPEC_SELECT1:%.*]] = select i1 [[UGT_9]], i32 1, i32 7
52ed48e6faSSam Parker; V8A-NEXT:    br label [[FOR_INC_PREHEADER]]
53ed48e6faSSam Parker; V8A:       for.inc.preheader:
54*8979ae42SNikita Popov; V8A-NEXT:    [[STR_PH_0:%.*]] = phi ptr [ [[GEP_A_2]], [[ENTRY:%.*]] ], [ [[INCDEC_PTR109_C4]], [[SW_BB92]] ]
55ed48e6faSSam Parker; V8A-NEXT:    [[CMP:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[SPEC_SELECT]], [[SW_BB92]] ]
56ed48e6faSSam Parker; V8A-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[SPEC_SELECT1]], [[SW_BB92]] ]
57ed48e6faSSam Parker; V8A-NEXT:    br label [[FOR_INC:%.*]]
58ed48e6faSSam Parker; V8A:       for.inc:
59*8979ae42SNikita Popov; V8A-NEXT:    [[STR_PH_1:%.*]] = phi ptr [ [[INCDEC_PTR109:%.*]], [[FOR_BODY:%.*]] ], [ [[STR_PH_0]], [[FOR_INC_PREHEADER]] ]
60*8979ae42SNikita Popov; V8A-NEXT:    [[INCDEC_PTR109]] = getelementptr inbounds i8, ptr [[STR_PH_1]], i32 1
61*8979ae42SNikita Popov; V8A-NEXT:    [[LOAD_1:%.*]] = load i8, ptr [[INCDEC_PTR109]], align 1
62ed48e6faSSam Parker; V8A-NEXT:    [[TOBOOL:%.*]] = icmp ne i8 [[LOAD_1]], 0
63ed48e6faSSam Parker; V8A-NEXT:    [[AND:%.*]] = and i1 [[CMP]], [[TOBOOL]]
64ed48e6faSSam Parker; V8A-NEXT:    br i1 [[AND]], label [[FOR_BODY]], label [[EXIT:%.*]]
65ed48e6faSSam Parker; V8A:       for.body:
66ed48e6faSSam Parker; V8A-NEXT:    [[CMP_1:%.*]] = icmp eq i8 [[LOAD_1]], 1
67ed48e6faSSam Parker; V8A-NEXT:    br i1 [[CMP_1]], label [[FOR_INC]], label [[SW_BB92]]
68ed48e6faSSam Parker; V8A:       exit:
69ed48e6faSSam Parker; V8A-NEXT:    ret i32 [[PHI_RES]]
70ed48e6faSSam Parker;
71ed48e6faSSam Parkerentry:
72*8979ae42SNikita Popov  %gep.a.2 = getelementptr inbounds i8, ptr %a, i32 2
73*8979ae42SNikita Popov  %incdec.ptr109.c4 = getelementptr inbounds i8, ptr %a, i32 3
74ed48e6faSSam Parker  %zero = icmp ne i8 %in, 0
75ed48e6faSSam Parker  br i1 %zero , label %for.inc.preheader, label %sw.bb92
76ed48e6faSSam Parker
77ed48e6faSSam Parkersw.bb92:
78ed48e6faSSam Parker  %c.off.i150 = add i8 %in, -48
79ed48e6faSSam Parker  %ugt.9 = icmp ugt i8 %c.off.i150, 9
80ed48e6faSSam Parker  br i1 %ugt.9, label %for.inc.preheader, label %select.unfold198
81ed48e6faSSam Parker
82ed48e6faSSam Parkerselect.unfold198:
83ed48e6faSSam Parker  br label %for.inc.preheader
84ed48e6faSSam Parker
85ed48e6faSSam Parkerfor.inc.preheader:
86*8979ae42SNikita Popov  %str.ph.0 = phi ptr [ %incdec.ptr109.c4, %select.unfold198 ], [ %incdec.ptr109.c4, %sw.bb92 ], [ %gep.a.2, %entry ]
87ed48e6faSSam Parker  %cmp = phi i1 [ true, %select.unfold198 ], [ false, %sw.bb92 ], [ false, %entry ]
88ed48e6faSSam Parker  %phi.res = phi i32 [ 7, %select.unfold198 ], [ 1, %sw.bb92 ], [ 1, %entry ]
89ed48e6faSSam Parker  br label %for.inc
90ed48e6faSSam Parker
91ed48e6faSSam Parkerfor.inc:
92*8979ae42SNikita Popov  %str.ph.1 = phi ptr [ %incdec.ptr109, %for.body ], [ %str.ph.0, %for.inc.preheader ]
93*8979ae42SNikita Popov  %incdec.ptr109 = getelementptr inbounds i8, ptr %str.ph.1, i32 1
94*8979ae42SNikita Popov  %load.1 = load i8, ptr %incdec.ptr109, align 1
95ed48e6faSSam Parker  %tobool = icmp ne i8 %load.1, 0
96ed48e6faSSam Parker  %and = and i1 %cmp, %tobool
97ed48e6faSSam Parker  br i1 %and, label %for.body, label %exit
98ed48e6faSSam Parker
99ed48e6faSSam Parkerfor.body:
100ed48e6faSSam Parker  %cmp.1 = icmp eq i8 %load.1, 1
101ed48e6faSSam Parker  br i1 %cmp.1, label %for.inc, label %sw.bb92
102ed48e6faSSam Parker
103ed48e6faSSam Parkerexit:
104ed48e6faSSam Parker  ret i32 %phi.res
105ed48e6faSSam Parker}
106ed48e6faSSam Parker
107*8979ae42SNikita Popovdefine i32 @multiple_spec_select_costs_minsize(ptr %a, ptr %idx, i8 %in) #0 {
108ac50efd6SSam Parker; V8M-LABEL: @multiple_spec_select_costs_minsize(
109ac50efd6SSam Parker; V8M-NEXT:  entry:
110*8979ae42SNikita Popov; V8M-NEXT:    [[GEP_A_2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i32 2
111*8979ae42SNikita Popov; V8M-NEXT:    [[INCDEC_PTR109_C4:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 3
112ac50efd6SSam Parker; V8M-NEXT:    [[ZERO:%.*]] = icmp ne i8 [[IN:%.*]], 0
113ac50efd6SSam Parker; V8M-NEXT:    br i1 [[ZERO]], label [[FOR_INC_PREHEADER:%.*]], label [[SW_BB92:%.*]]
114ac50efd6SSam Parker; V8M:       sw.bb92:
115ac50efd6SSam Parker; V8M-NEXT:    [[C_OFF_I150:%.*]] = add i8 [[IN]], -48
116ac50efd6SSam Parker; V8M-NEXT:    [[UGT_9:%.*]] = icmp ugt i8 [[C_OFF_I150]], 9
11747251582SSam Parker; V8M-NEXT:    br i1 [[UGT_9]], label [[FOR_INC_PREHEADER]], label [[SELECT_UNFOLD198:%.*]]
11847251582SSam Parker; V8M:       select.unfold198:
119ac50efd6SSam Parker; V8M-NEXT:    br label [[FOR_INC_PREHEADER]]
120ac50efd6SSam Parker; V8M:       for.inc.preheader:
121*8979ae42SNikita Popov; V8M-NEXT:    [[STR_PH_0:%.*]] = phi ptr [ [[INCDEC_PTR109_C4]], [[SELECT_UNFOLD198]] ], [ [[INCDEC_PTR109_C4]], [[SW_BB92]] ], [ [[GEP_A_2]], [[ENTRY:%.*]] ]
12247251582SSam Parker; V8M-NEXT:    [[CMP:%.*]] = phi i1 [ true, [[SELECT_UNFOLD198]] ], [ false, [[SW_BB92]] ], [ false, [[ENTRY]] ]
12347251582SSam Parker; V8M-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 7, [[SELECT_UNFOLD198]] ], [ 1, [[SW_BB92]] ], [ 1, [[ENTRY]] ]
124ac50efd6SSam Parker; V8M-NEXT:    br label [[FOR_INC:%.*]]
125ac50efd6SSam Parker; V8M:       for.inc:
126*8979ae42SNikita Popov; V8M-NEXT:    [[STR_PH_1:%.*]] = phi ptr [ [[INCDEC_PTR109:%.*]], [[FOR_BODY:%.*]] ], [ [[STR_PH_0]], [[FOR_INC_PREHEADER]] ]
127*8979ae42SNikita Popov; V8M-NEXT:    [[INCDEC_PTR109]] = getelementptr inbounds i8, ptr [[STR_PH_1]], i32 1
128*8979ae42SNikita Popov; V8M-NEXT:    [[LOAD_1:%.*]] = load i8, ptr [[INCDEC_PTR109]], align 1
129ac50efd6SSam Parker; V8M-NEXT:    [[TOBOOL:%.*]] = icmp ne i8 [[LOAD_1]], 0
130ac50efd6SSam Parker; V8M-NEXT:    [[AND:%.*]] = and i1 [[CMP]], [[TOBOOL]]
131ac50efd6SSam Parker; V8M-NEXT:    br i1 [[AND]], label [[FOR_BODY]], label [[EXIT:%.*]]
132ac50efd6SSam Parker; V8M:       for.body:
133ac50efd6SSam Parker; V8M-NEXT:    [[CMP_1:%.*]] = icmp eq i8 [[LOAD_1]], 1
134ac50efd6SSam Parker; V8M-NEXT:    br i1 [[CMP_1]], label [[FOR_INC]], label [[SW_BB92]]
135ac50efd6SSam Parker; V8M:       exit:
136ac50efd6SSam Parker; V8M-NEXT:    ret i32 [[PHI_RES]]
137ac50efd6SSam Parker;
138ac50efd6SSam Parker; V8A-LABEL: @multiple_spec_select_costs_minsize(
139ac50efd6SSam Parker; V8A-NEXT:  entry:
140*8979ae42SNikita Popov; V8A-NEXT:    [[GEP_A_2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i32 2
141*8979ae42SNikita Popov; V8A-NEXT:    [[INCDEC_PTR109_C4:%.*]] = getelementptr inbounds i8, ptr [[A]], i32 3
142ac50efd6SSam Parker; V8A-NEXT:    [[ZERO:%.*]] = icmp ne i8 [[IN:%.*]], 0
143ac50efd6SSam Parker; V8A-NEXT:    br i1 [[ZERO]], label [[FOR_INC_PREHEADER:%.*]], label [[SW_BB92:%.*]]
144ac50efd6SSam Parker; V8A:       sw.bb92:
145ac50efd6SSam Parker; V8A-NEXT:    [[C_OFF_I150:%.*]] = add i8 [[IN]], -48
146ac50efd6SSam Parker; V8A-NEXT:    [[UGT_9:%.*]] = icmp ugt i8 [[C_OFF_I150]], 9
147ac50efd6SSam Parker; V8A-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[UGT_9]], i1 false, i1 true
148ac50efd6SSam Parker; V8A-NEXT:    [[SPEC_SELECT1:%.*]] = select i1 [[UGT_9]], i32 1, i32 7
149ac50efd6SSam Parker; V8A-NEXT:    br label [[FOR_INC_PREHEADER]]
150ac50efd6SSam Parker; V8A:       for.inc.preheader:
151*8979ae42SNikita Popov; V8A-NEXT:    [[STR_PH_0:%.*]] = phi ptr [ [[GEP_A_2]], [[ENTRY:%.*]] ], [ [[INCDEC_PTR109_C4]], [[SW_BB92]] ]
152ac50efd6SSam Parker; V8A-NEXT:    [[CMP:%.*]] = phi i1 [ false, [[ENTRY]] ], [ [[SPEC_SELECT]], [[SW_BB92]] ]
153ac50efd6SSam Parker; V8A-NEXT:    [[PHI_RES:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[SPEC_SELECT1]], [[SW_BB92]] ]
154ac50efd6SSam Parker; V8A-NEXT:    br label [[FOR_INC:%.*]]
155ac50efd6SSam Parker; V8A:       for.inc:
156*8979ae42SNikita Popov; V8A-NEXT:    [[STR_PH_1:%.*]] = phi ptr [ [[INCDEC_PTR109:%.*]], [[FOR_BODY:%.*]] ], [ [[STR_PH_0]], [[FOR_INC_PREHEADER]] ]
157*8979ae42SNikita Popov; V8A-NEXT:    [[INCDEC_PTR109]] = getelementptr inbounds i8, ptr [[STR_PH_1]], i32 1
158*8979ae42SNikita Popov; V8A-NEXT:    [[LOAD_1:%.*]] = load i8, ptr [[INCDEC_PTR109]], align 1
159ac50efd6SSam Parker; V8A-NEXT:    [[TOBOOL:%.*]] = icmp ne i8 [[LOAD_1]], 0
160ac50efd6SSam Parker; V8A-NEXT:    [[AND:%.*]] = and i1 [[CMP]], [[TOBOOL]]
161ac50efd6SSam Parker; V8A-NEXT:    br i1 [[AND]], label [[FOR_BODY]], label [[EXIT:%.*]]
162ac50efd6SSam Parker; V8A:       for.body:
163ac50efd6SSam Parker; V8A-NEXT:    [[CMP_1:%.*]] = icmp eq i8 [[LOAD_1]], 1
164ac50efd6SSam Parker; V8A-NEXT:    br i1 [[CMP_1]], label [[FOR_INC]], label [[SW_BB92]]
165ac50efd6SSam Parker; V8A:       exit:
166ac50efd6SSam Parker; V8A-NEXT:    ret i32 [[PHI_RES]]
167ac50efd6SSam Parker;
168ac50efd6SSam Parkerentry:
169*8979ae42SNikita Popov  %gep.a.2 = getelementptr inbounds i8, ptr %a, i32 2
170*8979ae42SNikita Popov  %incdec.ptr109.c4 = getelementptr inbounds i8, ptr %a, i32 3
171ac50efd6SSam Parker  %zero = icmp ne i8 %in, 0
172ac50efd6SSam Parker  br i1 %zero , label %for.inc.preheader, label %sw.bb92
173ac50efd6SSam Parker
174ac50efd6SSam Parkersw.bb92:
175ac50efd6SSam Parker  %c.off.i150 = add i8 %in, -48
176ac50efd6SSam Parker  %ugt.9 = icmp ugt i8 %c.off.i150, 9
177ac50efd6SSam Parker  br i1 %ugt.9, label %for.inc.preheader, label %select.unfold198
178ac50efd6SSam Parker
179ac50efd6SSam Parkerselect.unfold198:
180ac50efd6SSam Parker  br label %for.inc.preheader
181ac50efd6SSam Parker
182ac50efd6SSam Parkerfor.inc.preheader:
183*8979ae42SNikita Popov  %str.ph.0 = phi ptr [ %incdec.ptr109.c4, %select.unfold198 ], [ %incdec.ptr109.c4, %sw.bb92 ], [ %gep.a.2, %entry ]
184ac50efd6SSam Parker  %cmp = phi i1 [ true, %select.unfold198 ], [ false, %sw.bb92 ], [ false, %entry ]
185ac50efd6SSam Parker  %phi.res = phi i32 [ 7, %select.unfold198 ], [ 1, %sw.bb92 ], [ 1, %entry ]
186ac50efd6SSam Parker  br label %for.inc
187ac50efd6SSam Parker
188ac50efd6SSam Parkerfor.inc:
189*8979ae42SNikita Popov  %str.ph.1 = phi ptr [ %incdec.ptr109, %for.body ], [ %str.ph.0, %for.inc.preheader ]
190*8979ae42SNikita Popov  %incdec.ptr109 = getelementptr inbounds i8, ptr %str.ph.1, i32 1
191*8979ae42SNikita Popov  %load.1 = load i8, ptr %incdec.ptr109, align 1
192ac50efd6SSam Parker  %tobool = icmp ne i8 %load.1, 0
193ac50efd6SSam Parker  %and = and i1 %cmp, %tobool
194ac50efd6SSam Parker  br i1 %and, label %for.body, label %exit
195ac50efd6SSam Parker
196ac50efd6SSam Parkerfor.body:
197ac50efd6SSam Parker  %cmp.1 = icmp eq i8 %load.1, 1
198ac50efd6SSam Parker  br i1 %cmp.1, label %for.inc, label %sw.bb92
199ac50efd6SSam Parker
200ac50efd6SSam Parkerexit:
201ac50efd6SSam Parker  ret i32 %phi.res
202ac50efd6SSam Parker}
203ac50efd6SSam Parker
204ac50efd6SSam Parkerattributes #0 = { minsize optsize }
205