284 lines · plain
1; RUN: opt -mtriple=thumbv8.1m.main-none-none-eabi -passes=hardware-loops %s -S -o - | FileCheck %s2 3@g = common local_unnamed_addr global ptr null, align 44 5; CHECK-LABEL: do_with_i32_urem6; CHECK: entry:7; CHECK: [[TEST:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %n)8; CHECK: [[TEST1:%[^ ]+]] = extractvalue { i32, i1 } [[TEST]], 19; CHECK: [[TEST0:%[^ ]+]] = extractvalue { i32, i1 } [[TEST]], 010; CHECK: br i1 [[TEST1]], label %while.body.preheader, label %while.end11 12; CHECK: while.body.preheader:13; CHECK-NEXT: br label %while.body14 15; CHECK: while.body:16; CHECK: [[REM:%[^ ]+]] = phi i32 [ [[TEST0]], %while.body.preheader ], [ [[LOOP_DEC:%[^ ]+]], %while.body ]17; CHECK: [[LOOP_DEC]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[REM]], i32 1)18; CHECK: [[CMP:%[^ ]+]] = icmp ne i32 [[LOOP_DEC]], 019; CHECK: br i1 [[CMP]], label %while.body, label %while.end.loopexit20 21define i32 @do_with_i32_urem(i32 %n) {22entry:23 %cmp7 = icmp eq i32 %n, 024 br i1 %cmp7, label %while.end, label %while.body.preheader25 26while.body.preheader:27 br label %while.body28 29while.body:30 %i.09 = phi i32 [ %inc1, %while.body ], [ 0, %while.body.preheader ]31 %res.08 = phi i32 [ %add, %while.body ], [ 0, %while.body.preheader ]32 %rem = urem i32 %i.09, 533 %add = add i32 %rem, %res.0834 %inc1 = add nuw i32 %i.09, 135 %exitcond = icmp eq i32 %inc1, %n36 br i1 %exitcond, label %while.end.loopexit, label %while.body37 38while.end.loopexit:39 br label %while.end40 41while.end:42 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %while.end.loopexit ]43 ret i32 %res.0.lcssa44}45 46; CHECK-LABEL: do_with_i32_srem47; CHECK: entry:48; CHECK: [[TEST:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %n)49; CHECK: [[TEST1:%[^ ]+]] = extractvalue { i32, i1 } [[TEST]], 150; CHECK: [[TEST0:%[^ ]+]] = extractvalue { i32, i1 } [[TEST]], 051; CHECK: br i1 [[TEST1]], label %while.body.preheader, label %while.end52 53; CHECK: while.body.preheader:54; CHECK-NEXT: br label %while.body55 56; CHECK: while.body:57; CHECK: [[REM:%[^ ]+]] = phi i32 [ [[TEST0]], %while.body.preheader ], [ [[LOOP_DEC:%[^ ]+]], %while.body ]58; CHECK: [[LOOP_DEC]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[REM]], i32 1)59; CHECK: [[CMP:%[^ ]+]] = icmp ne i32 [[LOOP_DEC]], 060; CHECK: br i1 [[CMP]], label %while.body, label %while.end.loopexit61 62define i32 @do_with_i32_srem(i32 %n) {63entry:64 %cmp7 = icmp eq i32 %n, 065 br i1 %cmp7, label %while.end, label %while.body.preheader66 67while.body.preheader:68 br label %while.body69 70while.body:71 %i.09 = phi i32 [ %inc1, %while.body ], [ 0, %while.body.preheader ]72 %res.08 = phi i32 [ %add, %while.body ], [ 0, %while.body.preheader ]73 %rem = srem i32 %i.09, 574 %add = sub i32 %rem, %res.0875 %inc1 = add nuw i32 %i.09, 176 %exitcond = icmp eq i32 %inc1, %n77 br i1 %exitcond, label %while.end.loopexit, label %while.body78 79while.end.loopexit:80 br label %while.end81 82while.end:83 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %while.end.loopexit ]84 ret i32 %res.0.lcssa85}86 87; CHECK-LABEL: do_with_i32_udiv88; CHECK: entry:89; CHECK: [[TEST:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %n)90; CHECK: [[TEST1:%[^ ]+]] = extractvalue { i32, i1 } [[TEST]], 191; CHECK: [[TEST0:%[^ ]+]] = extractvalue { i32, i1 } [[TEST]], 092; CHECK: br i1 [[TEST1]], label %while.body.preheader, label %while.end93 94; CHECK: while.body.preheader:95; CHECK-NEXT: br label %while.body96 97; CHECK: while.body:98; CHECK: [[REM:%[^ ]+]] = phi i32 [ [[TEST0]], %while.body.preheader ], [ [[LOOP_DEC:%[^ ]+]], %while.body ]99; CHECK: [[LOOP_DEC]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[REM]], i32 1)100; CHECK: [[CMP:%[^ ]+]] = icmp ne i32 [[LOOP_DEC]], 0101; CHECK: br i1 [[CMP]], label %while.body, label %while.end.loopexit102 103define i32 @do_with_i32_udiv(i32 %n) {104entry:105 %cmp7 = icmp eq i32 %n, 0106 br i1 %cmp7, label %while.end, label %while.body.preheader107 108while.body.preheader:109 br label %while.body110 111while.body:112 %i.09 = phi i32 [ %inc1, %while.body ], [ 0, %while.body.preheader ]113 %res.08 = phi i32 [ %add, %while.body ], [ 0, %while.body.preheader ]114 %rem = udiv i32 %i.09, 5115 %add = add i32 %rem, %res.08116 %inc1 = add nuw i32 %i.09, 1117 %exitcond = icmp eq i32 %inc1, %n118 br i1 %exitcond, label %while.end.loopexit, label %while.body119 120while.end.loopexit:121 br label %while.end122 123while.end:124 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %while.end.loopexit ]125 ret i32 %res.0.lcssa126}127 128; CHECK-LABEL: do_with_i32_sdiv129; CHECK: entry:130; CHECK: [[TEST:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %n)131; CHECK: [[TEST1:%[^ ]+]] = extractvalue { i32, i1 } [[TEST]], 1132; CHECK: [[TEST0:%[^ ]+]] = extractvalue { i32, i1 } [[TEST]], 0133; CHECK: br i1 [[TEST1]], label %while.body.preheader, label %while.end134 135; CHECK: while.body.preheader:136; CHECK-NEXT: br label %while.body137 138; CHECK: while.body:139; CHECK: [[REM:%[^ ]+]] = phi i32 [ [[TEST0]], %while.body.preheader ], [ [[LOOP_DEC:%[^ ]+]], %while.body ]140; CHECK: [[LOOP_DEC]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[REM]], i32 1)141; CHECK: [[CMP:%[^ ]+]] = icmp ne i32 [[LOOP_DEC]], 0142; CHECK: br i1 [[CMP]], label %while.body, label %while.end.loopexit143 144define i32 @do_with_i32_sdiv(i32 %n) {145entry:146 %cmp7 = icmp eq i32 %n, 0147 br i1 %cmp7, label %while.end, label %while.body.preheader148 149while.body.preheader:150 br label %while.body151 152while.body:153 %i.09 = phi i32 [ %inc1, %while.body ], [ 0, %while.body.preheader ]154 %res.08 = phi i32 [ %add, %while.body ], [ 0, %while.body.preheader ]155 %rem = sdiv i32 %i.09, 5156 %add = sub i32 %rem, %res.08157 %inc1 = add nuw i32 %i.09, 1158 %exitcond = icmp eq i32 %inc1, %n159 br i1 %exitcond, label %while.end.loopexit, label %while.body160 161while.end.loopexit:162 br label %while.end163 164while.end:165 %res.0.lcssa = phi i32 [ 0, %entry ], [ %add, %while.end.loopexit ]166 ret i32 %res.0.lcssa167}168 169; CHECK-LABEL: do_with_i64_urem170; CHECK-NOT: llvm.{{.*}}.loop.iterations171; CHECK-NOT: llvm.loop.decrement172define i64 @do_with_i64_urem(i32 %n) {173entry:174 %cmp7 = icmp eq i32 %n, 0175 br i1 %cmp7, label %while.end, label %while.body.preheader176 177while.body.preheader:178 br label %while.body179 180while.body:181 %i.09 = phi i32 [ %inc1, %while.body ], [ 0, %while.body.preheader ]182 %res.08 = phi i64 [ %add, %while.body ], [ 0, %while.body.preheader ]183 %conv = zext i32 %i.09 to i64184 %rem = urem i64 %conv, 5185 %add = add i64 %rem, %res.08186 %inc1 = add nuw i32 %i.09, 1187 %exitcond = icmp eq i32 %inc1, %n188 br i1 %exitcond, label %while.end.loopexit, label %while.body189 190while.end.loopexit:191 br label %while.end192 193while.end:194 %res.0.lcssa = phi i64 [ 0, %entry ], [ %add, %while.end.loopexit ]195 ret i64 %res.0.lcssa196}197 198; CHECK-LABEL: do_with_i64_srem199; CHECK-NOT: llvm.{{.*}}.loop.iterations200; CHECK-NOT: llvm.loop.decrement201define i64 @do_with_i64_srem(i32 %n) {202entry:203 %cmp7 = icmp eq i32 %n, 0204 br i1 %cmp7, label %while.end, label %while.body.preheader205 206while.body.preheader:207 br label %while.body208 209while.body:210 %i.09 = phi i32 [ %inc1, %while.body ], [ 0, %while.body.preheader ]211 %res.08 = phi i64 [ %add, %while.body ], [ 0, %while.body.preheader ]212 %conv = zext i32 %i.09 to i64213 %rem = srem i64 %conv, 5214 %add = sub i64 %rem, %res.08215 %inc1 = add nuw i32 %i.09, 1216 %exitcond = icmp eq i32 %inc1, %n217 br i1 %exitcond, label %while.end.loopexit, label %while.body218 219while.end.loopexit:220 br label %while.end221 222while.end:223 %res.0.lcssa = phi i64 [ 0, %entry ], [ %add, %while.end.loopexit ]224 ret i64 %res.0.lcssa225}226 227; CHECK-LABEL: do_with_i64_udiv228; CHECK-NOT: llvm.{{.*}}.loop.iterations229; CHECK-NOT: llvm.loop.decrement230define i64 @do_with_i64_udiv(i32 %n) {231entry:232 %cmp7 = icmp eq i32 %n, 0233 br i1 %cmp7, label %while.end, label %while.body.preheader234 235while.body.preheader:236 br label %while.body237 238while.body:239 %i.09 = phi i32 [ %inc1, %while.body ], [ 0, %while.body.preheader ]240 %res.08 = phi i64 [ %add, %while.body ], [ 0, %while.body.preheader ]241 %conv = zext i32 %i.09 to i64242 %rem = udiv i64 %conv, 5243 %add = add i64 %rem, %res.08244 %inc1 = add nuw i32 %i.09, 1245 %exitcond = icmp eq i32 %inc1, %n246 br i1 %exitcond, label %while.end.loopexit, label %while.body247 248while.end.loopexit:249 br label %while.end250 251while.end:252 %res.0.lcssa = phi i64 [ 0, %entry ], [ %add, %while.end.loopexit ]253 ret i64 %res.0.lcssa254}255 256; CHECK-LABEL: do_with_i64_sdiv257; CHECK-NOT: call void @llvm.{{.*}}.loop.iterations258; CHECK-NOT: call i32 @llvm.loop.decrement259define i64 @do_with_i64_sdiv(i32 %n) {260entry:261 %cmp7 = icmp eq i32 %n, 0262 br i1 %cmp7, label %while.end, label %while.body.preheader263 264while.body.preheader:265 br label %while.body266 267while.body:268 %i.09 = phi i32 [ %inc1, %while.body ], [ 0, %while.body.preheader ]269 %res.08 = phi i64 [ %add, %while.body ], [ 0, %while.body.preheader ]270 %conv = zext i32 %i.09 to i64271 %rem = sdiv i64 %conv, 5272 %add = sub i64 %rem, %res.08273 %inc1 = add nuw i32 %i.09, 1274 %exitcond = icmp eq i32 %inc1, %n275 br i1 %exitcond, label %while.end.loopexit, label %while.body276 277while.end.loopexit:278 br label %while.end279 280while.end:281 %res.0.lcssa = phi i64 [ 0, %entry ], [ %add, %while.end.loopexit ]282 ret i64 %res.0.lcssa283}284