brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.9 KiB · ed1b0e1 Raw
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