891 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s | FileCheck %s3 4; LSR should be able to eliminate the max computations by5; making the loops use slt/ult comparisons instead of ne comparisons.6 7target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"8target triple = "i386-apple-darwin9"9 10define void @foo(ptr %r, i32 %s, i32 %w, i32 %x, ptr %j, i32 %d) nounwind {11; CHECK-LABEL: foo:12; CHECK: ## %bb.0: ## %entry13; CHECK-NEXT: pushl %ebp14; CHECK-NEXT: pushl %ebx15; CHECK-NEXT: pushl %edi16; CHECK-NEXT: pushl %esi17; CHECK-NEXT: subl $28, %esp18; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edi19; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx20; CHECK-NEXT: movl {{[0-9]+}}(%esp), %esi21; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ebx22; CHECK-NEXT: movl %edx, %eax23; CHECK-NEXT: imull %esi, %eax24; CHECK-NEXT: cmpl $1, {{[0-9]+}}(%esp)25; CHECK-NEXT: movl %eax, (%esp) ## 4-byte Spill26; CHECK-NEXT: je LBB0_1927; CHECK-NEXT: ## %bb.1: ## %bb10.preheader28; CHECK-NEXT: movl %eax, %ebp29; CHECK-NEXT: sarl $31, %ebp30; CHECK-NEXT: shrl $30, %ebp31; CHECK-NEXT: addl %eax, %ebp32; CHECK-NEXT: sarl $2, %ebp33; CHECK-NEXT: testl %edx, %edx34; CHECK-NEXT: jle LBB0_1235; CHECK-NEXT: ## %bb.2: ## %bb.nph936; CHECK-NEXT: testl %esi, %esi37; CHECK-NEXT: jle LBB0_1238; CHECK-NEXT: ## %bb.3: ## %bb.nph9.split39; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax40; CHECK-NEXT: incl %eax41; CHECK-NEXT: xorl %ecx, %ecx42; CHECK-NEXT: movl %edi, %edx43; CHECK-NEXT: xorl %edi, %edi44; CHECK-NEXT: .p2align 445; CHECK-NEXT: LBB0_4: ## %bb646; CHECK-NEXT: ## =>This Inner Loop Header: Depth=147; CHECK-NEXT: movzbl (%eax,%edi,2), %ebx48; CHECK-NEXT: movb %bl, (%edx,%edi)49; CHECK-NEXT: incl %edi50; CHECK-NEXT: cmpl %esi, %edi51; CHECK-NEXT: jl LBB0_452; CHECK-NEXT: ## %bb.5: ## %bb953; CHECK-NEXT: ## in Loop: Header=BB0_4 Depth=154; CHECK-NEXT: incl %ecx55; CHECK-NEXT: addl {{[0-9]+}}(%esp), %eax56; CHECK-NEXT: addl %esi, %edx57; CHECK-NEXT: cmpl {{[0-9]+}}(%esp), %ecx58; CHECK-NEXT: je LBB0_1259; CHECK-NEXT: ## %bb.6: ## %bb7.preheader60; CHECK-NEXT: ## in Loop: Header=BB0_4 Depth=161; CHECK-NEXT: xorl %edi, %edi62; CHECK-NEXT: jmp LBB0_463; CHECK-NEXT: LBB0_12: ## %bb18.loopexit64; CHECK-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill65; CHECK-NEXT: movl (%esp), %eax ## 4-byte Reload66; CHECK-NEXT: addl %ebp, %eax67; CHECK-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill68; CHECK-NEXT: cmpl $1, {{[0-9]+}}(%esp)69; CHECK-NEXT: jle LBB0_1370; CHECK-NEXT: ## %bb.7: ## %bb.nph571; CHECK-NEXT: cmpl $2, %esi72; CHECK-NEXT: jl LBB0_1373; CHECK-NEXT: ## %bb.8: ## %bb.nph5.split74; CHECK-NEXT: movl %esi, %ebp75; CHECK-NEXT: shrl $31, %ebp76; CHECK-NEXT: addl %esi, %ebp77; CHECK-NEXT: sarl %ebp78; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax79; CHECK-NEXT: movl %eax, %ecx80; CHECK-NEXT: shrl $31, %ecx81; CHECK-NEXT: addl %eax, %ecx82; CHECK-NEXT: sarl %ecx83; CHECK-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill84; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx85; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax ## 4-byte Reload86; CHECK-NEXT: addl %ecx, %eax87; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx88; CHECK-NEXT: addl $2, %edx89; CHECK-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill90; CHECK-NEXT: movl (%esp), %edx ## 4-byte Reload91; CHECK-NEXT: addl %edx, %ecx92; CHECK-NEXT: xorl %edi, %edi93; CHECK-NEXT: xorl %edx, %edx94; CHECK-NEXT: .p2align 495; CHECK-NEXT: LBB0_9: ## %bb1396; CHECK-NEXT: ## =>This Loop Header: Depth=197; CHECK-NEXT: ## Child Loop BB0_10 Depth 298; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill99; CHECK-NEXT: andl $1, %edi100; CHECK-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill101; CHECK-NEXT: addl %edx, %edi102; CHECK-NEXT: imull {{[0-9]+}}(%esp), %edi103; CHECK-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %edi ## 4-byte Folded Reload104; CHECK-NEXT: xorl %ebx, %ebx105; CHECK-NEXT: .p2align 4106; CHECK-NEXT: LBB0_10: ## %bb14107; CHECK-NEXT: ## Parent Loop BB0_9 Depth=1108; CHECK-NEXT: ## => This Inner Loop Header: Depth=2109; CHECK-NEXT: movzbl -2(%edi,%ebx,4), %edx110; CHECK-NEXT: movb %dl, (%ecx,%ebx)111; CHECK-NEXT: movzbl (%edi,%ebx,4), %edx112; CHECK-NEXT: movb %dl, (%eax,%ebx)113; CHECK-NEXT: incl %ebx114; CHECK-NEXT: cmpl %ebp, %ebx115; CHECK-NEXT: jl LBB0_10116; CHECK-NEXT: ## %bb.11: ## %bb17117; CHECK-NEXT: ## in Loop: Header=BB0_9 Depth=1118; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi ## 4-byte Reload119; CHECK-NEXT: incl %edi120; CHECK-NEXT: addl %ebp, %eax121; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx ## 4-byte Reload122; CHECK-NEXT: addl $2, %edx123; CHECK-NEXT: addl %ebp, %ecx124; CHECK-NEXT: cmpl {{[-0-9]+}}(%e{{[sb]}}p), %edi ## 4-byte Folded Reload125; CHECK-NEXT: jl LBB0_9126; CHECK-NEXT: LBB0_13: ## %bb20127; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx128; CHECK-NEXT: cmpl $1, %ecx129; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx130; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ebx131; CHECK-NEXT: je LBB0_19132; CHECK-NEXT: ## %bb.14: ## %bb20133; CHECK-NEXT: cmpl $3, %ecx134; CHECK-NEXT: jne LBB0_24135; CHECK-NEXT: ## %bb.15: ## %bb22136; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp ## 4-byte Reload137; CHECK-NEXT: addl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill138; CHECK-NEXT: testl %edx, %edx139; CHECK-NEXT: jle LBB0_18140; CHECK-NEXT: ## %bb.16: ## %bb.nph141; CHECK-NEXT: leal 15(%edx), %eax142; CHECK-NEXT: andl $-16, %eax143; CHECK-NEXT: imull {{[0-9]+}}(%esp), %eax144; CHECK-NEXT: addl %ebp, %ebp145; CHECK-NEXT: movl (%esp), %ecx ## 4-byte Reload146; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edi147; CHECK-NEXT: addl %edi, %ecx148; CHECK-NEXT: addl %ecx, %ebp149; CHECK-NEXT: addl %eax, %ebx150; CHECK-NEXT: leal 15(%esi), %eax151; CHECK-NEXT: andl $-16, %eax152; CHECK-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill153; CHECK-NEXT: .p2align 4154; CHECK-NEXT: LBB0_17: ## %bb23155; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1156; CHECK-NEXT: subl $4, %esp157; CHECK-NEXT: pushl %esi158; CHECK-NEXT: pushl %ebx159; CHECK-NEXT: pushl %ebp160; CHECK-NEXT: movl %ebp, %edi161; CHECK-NEXT: movl %ebx, %ebp162; CHECK-NEXT: movl %edx, %ebx163; CHECK-NEXT: calll _memcpy164; CHECK-NEXT: movl %ebx, %edx165; CHECK-NEXT: movl %ebp, %ebx166; CHECK-NEXT: movl %edi, %ebp167; CHECK-NEXT: addl $16, %esp168; CHECK-NEXT: addl %esi, %ebp169; CHECK-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebx ## 4-byte Folded Reload170; CHECK-NEXT: decl %edx171; CHECK-NEXT: jne LBB0_17172; CHECK-NEXT: LBB0_18: ## %bb26173; CHECK-NEXT: movl (%esp), %ecx ## 4-byte Reload174; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi ## 4-byte Reload175; CHECK-NEXT: addl %ecx, %esi176; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx177; CHECK-NEXT: addl %esi, %edx178; CHECK-NEXT: jmp LBB0_23179; CHECK-NEXT: LBB0_19: ## %bb29180; CHECK-NEXT: testl %edx, %edx181; CHECK-NEXT: jle LBB0_22182; CHECK-NEXT: ## %bb.20: ## %bb.nph11183; CHECK-NEXT: leal 15(%esi), %eax184; CHECK-NEXT: andl $-16, %eax185; CHECK-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill186; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edi187; CHECK-NEXT: .p2align 4188; CHECK-NEXT: LBB0_21: ## %bb30189; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1190; CHECK-NEXT: subl $4, %esp191; CHECK-NEXT: pushl %esi192; CHECK-NEXT: pushl %ebx193; CHECK-NEXT: pushl %edi194; CHECK-NEXT: movl %ebx, %ebp195; CHECK-NEXT: movl %edx, %ebx196; CHECK-NEXT: calll _memcpy197; CHECK-NEXT: movl %ebx, %edx198; CHECK-NEXT: movl %ebp, %ebx199; CHECK-NEXT: addl $16, %esp200; CHECK-NEXT: addl %esi, %edi201; CHECK-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebx ## 4-byte Folded Reload202; CHECK-NEXT: decl %edx203; CHECK-NEXT: jne LBB0_21204; CHECK-NEXT: LBB0_22: ## %bb33205; CHECK-NEXT: movl (%esp), %ecx ## 4-byte Reload206; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx207; CHECK-NEXT: addl %ecx, %edx208; CHECK-NEXT: LBB0_23: ## %bb33209; CHECK-NEXT: movl %ecx, %eax210; CHECK-NEXT: shrl $31, %eax211; CHECK-NEXT: addl %ecx, %eax212; CHECK-NEXT: sarl %eax213; CHECK-NEXT: subl $4, %esp214; CHECK-NEXT: pushl %eax215; CHECK-NEXT: pushl $128216; CHECK-NEXT: pushl %edx217; CHECK-NEXT: calll _memset218; CHECK-NEXT: addl $44, %esp219; CHECK-NEXT: LBB0_25: ## %return220; CHECK-NEXT: popl %esi221; CHECK-NEXT: popl %edi222; CHECK-NEXT: popl %ebx223; CHECK-NEXT: popl %ebp224; CHECK-NEXT: retl225; CHECK-NEXT: LBB0_24: ## %return226; CHECK-NEXT: addl $28, %esp227; CHECK-NEXT: jmp LBB0_25228entry:229 %0 = mul i32 %x, %w230 %1 = mul i32 %x, %w231 %2 = sdiv i32 %1, 4232 %.sum2 = add i32 %2, %0233 %cond = icmp eq i32 %d, 1234 br i1 %cond, label %bb29, label %bb10.preheader235 236bb10.preheader: ; preds = %entry237 %3 = icmp sgt i32 %x, 0238 br i1 %3, label %bb.nph9, label %bb18.loopexit239 240bb.nph7: ; preds = %bb7.preheader241 %4 = mul i32 %y.08, %w242 %5 = mul i32 %y.08, %s243 %6 = add i32 %5, 1244 %tmp8 = icmp sgt i32 1, %w245 %smax9 = select i1 %tmp8, i32 1, i32 %w246 br label %bb6247 248bb6: ; preds = %bb7, %bb.nph7249 %x.06 = phi i32 [ 0, %bb.nph7 ], [ %indvar.next7, %bb7 ]250 %7 = add i32 %x.06, %4251 %8 = shl i32 %x.06, 1252 %9 = add i32 %6, %8253 %10 = getelementptr i8, ptr %r, i32 %9254 %11 = load i8, ptr %10, align 1255 %12 = getelementptr i8, ptr %j, i32 %7256 store i8 %11, ptr %12, align 1257 br label %bb7258 259bb7: ; preds = %bb6260 %indvar.next7 = add i32 %x.06, 1261 %exitcond10 = icmp ne i32 %indvar.next7, %smax9262 br i1 %exitcond10, label %bb6, label %bb7.bb9_crit_edge263 264bb7.bb9_crit_edge: ; preds = %bb7265 br label %bb9266 267bb9: ; preds = %bb7.preheader, %bb7.bb9_crit_edge268 br label %bb10269 270bb10: ; preds = %bb9271 %indvar.next11 = add i32 %y.08, 1272 %exitcond12 = icmp ne i32 %indvar.next11, %x273 br i1 %exitcond12, label %bb7.preheader, label %bb10.bb18.loopexit_crit_edge274 275bb10.bb18.loopexit_crit_edge: ; preds = %bb10276 br label %bb10.bb18.loopexit_crit_edge.split277 278bb10.bb18.loopexit_crit_edge.split: ; preds = %bb.nph9, %bb10.bb18.loopexit_crit_edge279 br label %bb18.loopexit280 281bb.nph9: ; preds = %bb10.preheader282 %13 = icmp sgt i32 %w, 0283 br i1 %13, label %bb.nph9.split, label %bb10.bb18.loopexit_crit_edge.split284 285bb.nph9.split: ; preds = %bb.nph9286 br label %bb7.preheader287 288bb7.preheader: ; preds = %bb.nph9.split, %bb10289 %y.08 = phi i32 [ 0, %bb.nph9.split ], [ %indvar.next11, %bb10 ]290 br i1 true, label %bb.nph7, label %bb9291 292bb.nph5: ; preds = %bb18.loopexit293 %14 = sdiv i32 %w, 2294 %15 = icmp slt i32 %w, 2295 %16 = sdiv i32 %x, 2296 br i1 %15, label %bb18.bb20_crit_edge.split, label %bb.nph5.split297 298bb.nph5.split: ; preds = %bb.nph5299 %tmp2 = icmp sgt i32 1, %16300 %smax3 = select i1 %tmp2, i32 1, i32 %16301 br label %bb13302 303bb13: ; preds = %bb18, %bb.nph5.split304 %y.14 = phi i32 [ 0, %bb.nph5.split ], [ %indvar.next1, %bb18 ]305 %17 = mul i32 %14, %y.14306 %18 = shl i32 %y.14, 1307 %19 = srem i32 %y.14, 2308 %20 = add i32 %19, %18309 %21 = mul i32 %20, %s310 br i1 true, label %bb.nph3, label %bb17311 312bb.nph3: ; preds = %bb13313 %22 = add i32 %17, %0314 %23 = add i32 %17, %.sum2315 %24 = sdiv i32 %w, 2316 %tmp = icmp sgt i32 1, %24317 %smax = select i1 %tmp, i32 1, i32 %24318 br label %bb14319 320bb14: ; preds = %bb15, %bb.nph3321 %x.12 = phi i32 [ 0, %bb.nph3 ], [ %indvar.next, %bb15 ]322 %25 = shl i32 %x.12, 2323 %26 = add i32 %25, %21324 %27 = getelementptr i8, ptr %r, i32 %26325 %28 = load i8, ptr %27, align 1326 %.sum = add i32 %22, %x.12327 %29 = getelementptr i8, ptr %j, i32 %.sum328 store i8 %28, ptr %29, align 1329 %30 = shl i32 %x.12, 2330 %31 = or disjoint i32 %30, 2331 %32 = add i32 %31, %21332 %33 = getelementptr i8, ptr %r, i32 %32333 %34 = load i8, ptr %33, align 1334 %.sum6 = add i32 %23, %x.12335 %35 = getelementptr i8, ptr %j, i32 %.sum6336 store i8 %34, ptr %35, align 1337 br label %bb15338 339bb15: ; preds = %bb14340 %indvar.next = add i32 %x.12, 1341 %exitcond = icmp ne i32 %indvar.next, %smax342 br i1 %exitcond, label %bb14, label %bb15.bb17_crit_edge343 344bb15.bb17_crit_edge: ; preds = %bb15345 br label %bb17346 347bb17: ; preds = %bb15.bb17_crit_edge, %bb13348 br label %bb18349 350bb18.loopexit: ; preds = %bb10.bb18.loopexit_crit_edge.split, %bb10.preheader351 %36 = icmp slt i32 %x, 2352 br i1 %36, label %bb20, label %bb.nph5353 354bb18: ; preds = %bb17355 %indvar.next1 = add i32 %y.14, 1356 %exitcond4 = icmp ne i32 %indvar.next1, %smax3357 br i1 %exitcond4, label %bb13, label %bb18.bb20_crit_edge358 359bb18.bb20_crit_edge: ; preds = %bb18360 br label %bb18.bb20_crit_edge.split361 362bb18.bb20_crit_edge.split: ; preds = %bb18.bb20_crit_edge, %bb.nph5363 br label %bb20364 365bb20: ; preds = %bb18.bb20_crit_edge.split, %bb18.loopexit366 switch i32 %d, label %return [367 i32 3, label %bb22368 i32 1, label %bb29369 ]370 371bb22: ; preds = %bb20372 %37 = mul i32 %x, %w373 %38 = sdiv i32 %37, 4374 %.sum3 = add i32 %38, %.sum2375 %39 = add i32 %x, 15376 %40 = and i32 %39, -16377 %41 = add i32 %w, 15378 %42 = and i32 %41, -16379 %43 = mul i32 %40, %s380 %44 = icmp sgt i32 %x, 0381 br i1 %44, label %bb.nph, label %bb26382 383bb.nph: ; preds = %bb22384 br label %bb23385 386bb23: ; preds = %bb24, %bb.nph387 %y.21 = phi i32 [ 0, %bb.nph ], [ %indvar.next5, %bb24 ]388 %45 = mul i32 %y.21, %42389 %.sum1 = add i32 %45, %43390 %46 = getelementptr i8, ptr %r, i32 %.sum1391 %47 = mul i32 %y.21, %w392 %.sum5 = add i32 %47, %.sum3393 %48 = getelementptr i8, ptr %j, i32 %.sum5394 tail call void @llvm.memcpy.p0.p0.i32(ptr %48, ptr %46, i32 %w, i1 false)395 br label %bb24396 397bb24: ; preds = %bb23398 %indvar.next5 = add i32 %y.21, 1399 %exitcond6 = icmp ne i32 %indvar.next5, %x400 br i1 %exitcond6, label %bb23, label %bb24.bb26_crit_edge401 402bb24.bb26_crit_edge: ; preds = %bb24403 br label %bb26404 405bb26: ; preds = %bb24.bb26_crit_edge, %bb22406 %49 = mul i32 %x, %w407 %.sum4 = add i32 %.sum3, %49408 %50 = getelementptr i8, ptr %j, i32 %.sum4409 %51 = mul i32 %x, %w410 %52 = sdiv i32 %51, 2411 tail call void @llvm.memset.p0.i32(ptr %50, i8 -128, i32 %52, i1 false)412 ret void413 414bb29: ; preds = %bb20, %entry415 %53 = add i32 %w, 15416 %54 = and i32 %53, -16417 %55 = icmp sgt i32 %x, 0418 br i1 %55, label %bb.nph11, label %bb33419 420bb.nph11: ; preds = %bb29421 br label %bb30422 423bb30: ; preds = %bb31, %bb.nph11424 %y.310 = phi i32 [ 0, %bb.nph11 ], [ %indvar.next13, %bb31 ]425 %56 = mul i32 %y.310, %54426 %57 = getelementptr i8, ptr %r, i32 %56427 %58 = mul i32 %y.310, %w428 %59 = getelementptr i8, ptr %j, i32 %58429 tail call void @llvm.memcpy.p0.p0.i32(ptr %59, ptr %57, i32 %w, i1 false)430 br label %bb31431 432bb31: ; preds = %bb30433 %indvar.next13 = add i32 %y.310, 1434 %exitcond14 = icmp ne i32 %indvar.next13, %x435 br i1 %exitcond14, label %bb30, label %bb31.bb33_crit_edge436 437bb31.bb33_crit_edge: ; preds = %bb31438 br label %bb33439 440bb33: ; preds = %bb31.bb33_crit_edge, %bb29441 %60 = mul i32 %x, %w442 %61 = getelementptr i8, ptr %j, i32 %60443 %62 = mul i32 %x, %w444 %63 = sdiv i32 %62, 2445 tail call void @llvm.memset.p0.i32(ptr %61, i8 -128, i32 %63, i1 false)446 ret void447 448return: ; preds = %bb20449 ret void450}451 452define void @bar(ptr %r, i32 %s, i32 %w, i32 %x, ptr %j, i32 %d) nounwind {453; CHECK-LABEL: bar:454; CHECK: ## %bb.0: ## %entry455; CHECK-NEXT: pushl %ebp456; CHECK-NEXT: pushl %ebx457; CHECK-NEXT: pushl %edi458; CHECK-NEXT: pushl %esi459; CHECK-NEXT: subl $28, %esp460; CHECK-NEXT: movl {{[0-9]+}}(%esp), %esi461; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ebp462; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax463; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx464; CHECK-NEXT: movl %ebp, %edx465; CHECK-NEXT: imull %eax, %edx466; CHECK-NEXT: cmpl $1, {{[0-9]+}}(%esp)467; CHECK-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill468; CHECK-NEXT: je LBB1_19469; CHECK-NEXT: ## %bb.1: ## %bb10.preheader470; CHECK-NEXT: movl %edx, %ecx471; CHECK-NEXT: shrl $2, %ecx472; CHECK-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill473; CHECK-NEXT: testl %ebp, %ebp474; CHECK-NEXT: movl %eax, %edi475; CHECK-NEXT: je LBB1_12476; CHECK-NEXT: ## %bb.2: ## %bb.nph9477; CHECK-NEXT: testl %eax, %eax478; CHECK-NEXT: je LBB1_12479; CHECK-NEXT: ## %bb.3: ## %bb.nph9.split480; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax481; CHECK-NEXT: incl %eax482; CHECK-NEXT: xorl %ecx, %ecx483; CHECK-NEXT: movl %esi, %edx484; CHECK-NEXT: xorl %esi, %esi485; CHECK-NEXT: .p2align 4486; CHECK-NEXT: LBB1_4: ## %bb6487; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1488; CHECK-NEXT: movzbl (%eax,%esi,2), %ebx489; CHECK-NEXT: movb %bl, (%edx,%esi)490; CHECK-NEXT: incl %esi491; CHECK-NEXT: cmpl %edi, %esi492; CHECK-NEXT: jb LBB1_4493; CHECK-NEXT: ## %bb.5: ## %bb9494; CHECK-NEXT: ## in Loop: Header=BB1_4 Depth=1495; CHECK-NEXT: incl %ecx496; CHECK-NEXT: addl {{[0-9]+}}(%esp), %eax497; CHECK-NEXT: addl %edi, %edx498; CHECK-NEXT: cmpl %ebp, %ecx499; CHECK-NEXT: je LBB1_12500; CHECK-NEXT: ## %bb.6: ## %bb7.preheader501; CHECK-NEXT: ## in Loop: Header=BB1_4 Depth=1502; CHECK-NEXT: xorl %esi, %esi503; CHECK-NEXT: jmp LBB1_4504; CHECK-NEXT: LBB1_12: ## %bb18.loopexit505; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax ## 4-byte Reload506; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload507; CHECK-NEXT: addl %ecx, %eax508; CHECK-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill509; CHECK-NEXT: cmpl $1, %ebp510; CHECK-NEXT: jbe LBB1_13511; CHECK-NEXT: ## %bb.7: ## %bb.nph5512; CHECK-NEXT: cmpl $2, %edi513; CHECK-NEXT: jb LBB1_13514; CHECK-NEXT: ## %bb.8: ## %bb.nph5.split515; CHECK-NEXT: movl %edi, %ebp516; CHECK-NEXT: shrl %ebp517; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax518; CHECK-NEXT: shrl %eax519; CHECK-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill520; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax521; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload522; CHECK-NEXT: addl %eax, %ecx523; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx524; CHECK-NEXT: addl $2, %edx525; CHECK-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill526; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx ## 4-byte Reload527; CHECK-NEXT: addl %edx, %eax528; CHECK-NEXT: xorl %edx, %edx529; CHECK-NEXT: xorl %esi, %esi530; CHECK-NEXT: .p2align 4531; CHECK-NEXT: LBB1_9: ## %bb13532; CHECK-NEXT: ## =>This Loop Header: Depth=1533; CHECK-NEXT: ## Child Loop BB1_10 Depth 2534; CHECK-NEXT: movl %edx, (%esp) ## 4-byte Spill535; CHECK-NEXT: andl $1, %edx536; CHECK-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill537; CHECK-NEXT: addl %esi, %edx538; CHECK-NEXT: imull {{[0-9]+}}(%esp), %edx539; CHECK-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %edx ## 4-byte Folded Reload540; CHECK-NEXT: xorl %esi, %esi541; CHECK-NEXT: .p2align 4542; CHECK-NEXT: LBB1_10: ## %bb14543; CHECK-NEXT: ## Parent Loop BB1_9 Depth=1544; CHECK-NEXT: ## => This Inner Loop Header: Depth=2545; CHECK-NEXT: movzbl -2(%edx,%esi,4), %ebx546; CHECK-NEXT: movb %bl, (%eax,%esi)547; CHECK-NEXT: movzbl (%edx,%esi,4), %ebx548; CHECK-NEXT: movb %bl, (%ecx,%esi)549; CHECK-NEXT: incl %esi550; CHECK-NEXT: cmpl %ebp, %esi551; CHECK-NEXT: jb LBB1_10552; CHECK-NEXT: ## %bb.11: ## %bb17553; CHECK-NEXT: ## in Loop: Header=BB1_9 Depth=1554; CHECK-NEXT: movl (%esp), %edx ## 4-byte Reload555; CHECK-NEXT: incl %edx556; CHECK-NEXT: addl %ebp, %ecx557; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi ## 4-byte Reload558; CHECK-NEXT: addl $2, %esi559; CHECK-NEXT: addl %ebp, %eax560; CHECK-NEXT: cmpl {{[-0-9]+}}(%e{{[sb]}}p), %edx ## 4-byte Folded Reload561; CHECK-NEXT: jb LBB1_9562; CHECK-NEXT: LBB1_13: ## %bb20563; CHECK-NEXT: movl {{[0-9]+}}(%esp), %esi564; CHECK-NEXT: cmpl $1, %esi565; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ebp566; CHECK-NEXT: movl %edi, %eax567; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx568; CHECK-NEXT: je LBB1_19569; CHECK-NEXT: ## %bb.14: ## %bb20570; CHECK-NEXT: cmpl $3, %esi571; CHECK-NEXT: jne LBB1_24572; CHECK-NEXT: ## %bb.15: ## %bb22573; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx ## 4-byte Reload574; CHECK-NEXT: addl %edx, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Folded Spill575; CHECK-NEXT: testl %ebp, %ebp576; CHECK-NEXT: je LBB1_18577; CHECK-NEXT: ## %bb.16: ## %bb.nph578; CHECK-NEXT: movl %ebp, %esi579; CHECK-NEXT: leal 15(%ebp), %eax580; CHECK-NEXT: andl $-16, %eax581; CHECK-NEXT: imull {{[0-9]+}}(%esp), %eax582; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx583; CHECK-NEXT: addl $15, %edx584; CHECK-NEXT: andl $-16, %edx585; CHECK-NEXT: movl %edx, (%esp) ## 4-byte Spill586; CHECK-NEXT: addl %eax, %ecx587; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax ## 4-byte Reload588; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx589; CHECK-NEXT: leal (%edx,%eax), %ebp590; CHECK-NEXT: .p2align 4591; CHECK-NEXT: LBB1_17: ## %bb23592; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1593; CHECK-NEXT: subl $4, %esp594; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ebx595; CHECK-NEXT: pushl %ebx596; CHECK-NEXT: pushl %ecx597; CHECK-NEXT: pushl %ebp598; CHECK-NEXT: movl %ecx, %edi599; CHECK-NEXT: calll _memcpy600; CHECK-NEXT: movl %edi, %ecx601; CHECK-NEXT: addl $16, %esp602; CHECK-NEXT: addl %ebx, %ebp603; CHECK-NEXT: addl (%esp), %ecx ## 4-byte Folded Reload604; CHECK-NEXT: decl %esi605; CHECK-NEXT: jne LBB1_17606; CHECK-NEXT: LBB1_18: ## %bb26607; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax ## 4-byte Reload608; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx ## 4-byte Reload609; CHECK-NEXT: addl %ecx, %eax610; CHECK-NEXT: movl {{[0-9]+}}(%esp), %edx611; CHECK-NEXT: addl %eax, %edx612; CHECK-NEXT: shrl %ecx613; CHECK-NEXT: subl $4, %esp614; CHECK-NEXT: pushl %ecx615; CHECK-NEXT: pushl $128616; CHECK-NEXT: pushl %edx617; CHECK-NEXT: jmp LBB1_23618; CHECK-NEXT: LBB1_19: ## %bb29619; CHECK-NEXT: testl %ebp, %ebp620; CHECK-NEXT: je LBB1_22621; CHECK-NEXT: ## %bb.20: ## %bb.nph11622; CHECK-NEXT: movl %ebp, %esi623; CHECK-NEXT: movl %eax, %edi624; CHECK-NEXT: addl $15, %eax625; CHECK-NEXT: andl $-16, %eax626; CHECK-NEXT: movl %eax, (%esp) ## 4-byte Spill627; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ebp628; CHECK-NEXT: .p2align 4629; CHECK-NEXT: LBB1_21: ## %bb30630; CHECK-NEXT: ## =>This Inner Loop Header: Depth=1631; CHECK-NEXT: subl $4, %esp632; CHECK-NEXT: pushl %edi633; CHECK-NEXT: pushl %ecx634; CHECK-NEXT: pushl %ebp635; CHECK-NEXT: movl %ecx, %ebx636; CHECK-NEXT: calll _memcpy637; CHECK-NEXT: movl %ebx, %ecx638; CHECK-NEXT: addl $16, %esp639; CHECK-NEXT: addl %edi, %ebp640; CHECK-NEXT: addl (%esp), %ecx ## 4-byte Folded Reload641; CHECK-NEXT: decl %esi642; CHECK-NEXT: jne LBB1_21643; CHECK-NEXT: LBB1_22: ## %bb33644; CHECK-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax ## 4-byte Reload645; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx646; CHECK-NEXT: addl %eax, %ecx647; CHECK-NEXT: shrl %eax648; CHECK-NEXT: subl $4, %esp649; CHECK-NEXT: pushl %eax650; CHECK-NEXT: pushl $128651; CHECK-NEXT: pushl %ecx652; CHECK-NEXT: LBB1_23: ## %bb33653; CHECK-NEXT: calll _memset654; CHECK-NEXT: addl $44, %esp655; CHECK-NEXT: LBB1_25: ## %return656; CHECK-NEXT: popl %esi657; CHECK-NEXT: popl %edi658; CHECK-NEXT: popl %ebx659; CHECK-NEXT: popl %ebp660; CHECK-NEXT: retl661; CHECK-NEXT: LBB1_24: ## %return662; CHECK-NEXT: addl $28, %esp663; CHECK-NEXT: jmp LBB1_25664entry:665 %0 = mul i32 %x, %w666 %1 = mul i32 %x, %w667 %2 = udiv i32 %1, 4668 %.sum2 = add i32 %2, %0669 %cond = icmp eq i32 %d, 1670 br i1 %cond, label %bb29, label %bb10.preheader671 672bb10.preheader: ; preds = %entry673 %3 = icmp ne i32 %x, 0674 br i1 %3, label %bb.nph9, label %bb18.loopexit675 676bb.nph7: ; preds = %bb7.preheader677 %4 = mul i32 %y.08, %w678 %5 = mul i32 %y.08, %s679 %6 = add i32 %5, 1680 %tmp8 = icmp ugt i32 1, %w681 %smax9 = select i1 %tmp8, i32 1, i32 %w682 br label %bb6683 684bb6: ; preds = %bb7, %bb.nph7685 %x.06 = phi i32 [ 0, %bb.nph7 ], [ %indvar.next7, %bb7 ]686 %7 = add i32 %x.06, %4687 %8 = shl i32 %x.06, 1688 %9 = add i32 %6, %8689 %10 = getelementptr i8, ptr %r, i32 %9690 %11 = load i8, ptr %10, align 1691 %12 = getelementptr i8, ptr %j, i32 %7692 store i8 %11, ptr %12, align 1693 br label %bb7694 695bb7: ; preds = %bb6696 %indvar.next7 = add i32 %x.06, 1697 %exitcond10 = icmp ne i32 %indvar.next7, %smax9698 br i1 %exitcond10, label %bb6, label %bb7.bb9_crit_edge699 700bb7.bb9_crit_edge: ; preds = %bb7701 br label %bb9702 703bb9: ; preds = %bb7.preheader, %bb7.bb9_crit_edge704 br label %bb10705 706bb10: ; preds = %bb9707 %indvar.next11 = add i32 %y.08, 1708 %exitcond12 = icmp ne i32 %indvar.next11, %x709 br i1 %exitcond12, label %bb7.preheader, label %bb10.bb18.loopexit_crit_edge710 711bb10.bb18.loopexit_crit_edge: ; preds = %bb10712 br label %bb10.bb18.loopexit_crit_edge.split713 714bb10.bb18.loopexit_crit_edge.split: ; preds = %bb.nph9, %bb10.bb18.loopexit_crit_edge715 br label %bb18.loopexit716 717bb.nph9: ; preds = %bb10.preheader718 %13 = icmp ugt i32 %w, 0719 br i1 %13, label %bb.nph9.split, label %bb10.bb18.loopexit_crit_edge.split720 721bb.nph9.split: ; preds = %bb.nph9722 br label %bb7.preheader723 724bb7.preheader: ; preds = %bb.nph9.split, %bb10725 %y.08 = phi i32 [ 0, %bb.nph9.split ], [ %indvar.next11, %bb10 ]726 br i1 true, label %bb.nph7, label %bb9727 728bb.nph5: ; preds = %bb18.loopexit729 %14 = udiv i32 %w, 2730 %15 = icmp ult i32 %w, 2731 %16 = udiv i32 %x, 2732 br i1 %15, label %bb18.bb20_crit_edge.split, label %bb.nph5.split733 734bb.nph5.split: ; preds = %bb.nph5735 %tmp2 = icmp ugt i32 1, %16736 %smax3 = select i1 %tmp2, i32 1, i32 %16737 br label %bb13738 739bb13: ; preds = %bb18, %bb.nph5.split740 %y.14 = phi i32 [ 0, %bb.nph5.split ], [ %indvar.next1, %bb18 ]741 %17 = mul i32 %14, %y.14742 %18 = shl i32 %y.14, 1743 %19 = urem i32 %y.14, 2744 %20 = add i32 %19, %18745 %21 = mul i32 %20, %s746 br i1 true, label %bb.nph3, label %bb17747 748bb.nph3: ; preds = %bb13749 %22 = add i32 %17, %0750 %23 = add i32 %17, %.sum2751 %24 = udiv i32 %w, 2752 %tmp = icmp ugt i32 1, %24753 %smax = select i1 %tmp, i32 1, i32 %24754 br label %bb14755 756bb14: ; preds = %bb15, %bb.nph3757 %x.12 = phi i32 [ 0, %bb.nph3 ], [ %indvar.next, %bb15 ]758 %25 = shl i32 %x.12, 2759 %26 = add i32 %25, %21760 %27 = getelementptr i8, ptr %r, i32 %26761 %28 = load i8, ptr %27, align 1762 %.sum = add i32 %22, %x.12763 %29 = getelementptr i8, ptr %j, i32 %.sum764 store i8 %28, ptr %29, align 1765 %30 = shl i32 %x.12, 2766 %31 = or disjoint i32 %30, 2767 %32 = add i32 %31, %21768 %33 = getelementptr i8, ptr %r, i32 %32769 %34 = load i8, ptr %33, align 1770 %.sum6 = add i32 %23, %x.12771 %35 = getelementptr i8, ptr %j, i32 %.sum6772 store i8 %34, ptr %35, align 1773 br label %bb15774 775bb15: ; preds = %bb14776 %indvar.next = add i32 %x.12, 1777 %exitcond = icmp ne i32 %indvar.next, %smax778 br i1 %exitcond, label %bb14, label %bb15.bb17_crit_edge779 780bb15.bb17_crit_edge: ; preds = %bb15781 br label %bb17782 783bb17: ; preds = %bb15.bb17_crit_edge, %bb13784 br label %bb18785 786bb18.loopexit: ; preds = %bb10.bb18.loopexit_crit_edge.split, %bb10.preheader787 %36 = icmp ult i32 %x, 2788 br i1 %36, label %bb20, label %bb.nph5789 790bb18: ; preds = %bb17791 %indvar.next1 = add i32 %y.14, 1792 %exitcond4 = icmp ne i32 %indvar.next1, %smax3793 br i1 %exitcond4, label %bb13, label %bb18.bb20_crit_edge794 795bb18.bb20_crit_edge: ; preds = %bb18796 br label %bb18.bb20_crit_edge.split797 798bb18.bb20_crit_edge.split: ; preds = %bb18.bb20_crit_edge, %bb.nph5799 br label %bb20800 801bb20: ; preds = %bb18.bb20_crit_edge.split, %bb18.loopexit802 switch i32 %d, label %return [803 i32 3, label %bb22804 i32 1, label %bb29805 ]806 807bb22: ; preds = %bb20808 %37 = mul i32 %x, %w809 %38 = udiv i32 %37, 4810 %.sum3 = add i32 %38, %.sum2811 %39 = add i32 %x, 15812 %40 = and i32 %39, -16813 %41 = add i32 %w, 15814 %42 = and i32 %41, -16815 %43 = mul i32 %40, %s816 %44 = icmp ugt i32 %x, 0817 br i1 %44, label %bb.nph, label %bb26818 819bb.nph: ; preds = %bb22820 br label %bb23821 822bb23: ; preds = %bb24, %bb.nph823 %y.21 = phi i32 [ 0, %bb.nph ], [ %indvar.next5, %bb24 ]824 %45 = mul i32 %y.21, %42825 %.sum1 = add i32 %45, %43826 %46 = getelementptr i8, ptr %r, i32 %.sum1827 %47 = mul i32 %y.21, %w828 %.sum5 = add i32 %47, %.sum3829 %48 = getelementptr i8, ptr %j, i32 %.sum5830 tail call void @llvm.memcpy.p0.p0.i32(ptr %48, ptr %46, i32 %w, i1 false)831 br label %bb24832 833bb24: ; preds = %bb23834 %indvar.next5 = add i32 %y.21, 1835 %exitcond6 = icmp ne i32 %indvar.next5, %x836 br i1 %exitcond6, label %bb23, label %bb24.bb26_crit_edge837 838bb24.bb26_crit_edge: ; preds = %bb24839 br label %bb26840 841bb26: ; preds = %bb24.bb26_crit_edge, %bb22842 %49 = mul i32 %x, %w843 %.sum4 = add i32 %.sum3, %49844 %50 = getelementptr i8, ptr %j, i32 %.sum4845 %51 = mul i32 %x, %w846 %52 = udiv i32 %51, 2847 tail call void @llvm.memset.p0.i32(ptr %50, i8 -128, i32 %52, i1 false)848 ret void849 850bb29: ; preds = %bb20, %entry851 %53 = add i32 %w, 15852 %54 = and i32 %53, -16853 %55 = icmp ugt i32 %x, 0854 br i1 %55, label %bb.nph11, label %bb33855 856bb.nph11: ; preds = %bb29857 br label %bb30858 859bb30: ; preds = %bb31, %bb.nph11860 %y.310 = phi i32 [ 0, %bb.nph11 ], [ %indvar.next13, %bb31 ]861 %56 = mul i32 %y.310, %54862 %57 = getelementptr i8, ptr %r, i32 %56863 %58 = mul i32 %y.310, %w864 %59 = getelementptr i8, ptr %j, i32 %58865 tail call void @llvm.memcpy.p0.p0.i32(ptr %59, ptr %57, i32 %w, i1 false)866 br label %bb31867 868bb31: ; preds = %bb30869 %indvar.next13 = add i32 %y.310, 1870 %exitcond14 = icmp ne i32 %indvar.next13, %x871 br i1 %exitcond14, label %bb30, label %bb31.bb33_crit_edge872 873bb31.bb33_crit_edge: ; preds = %bb31874 br label %bb33875 876bb33: ; preds = %bb31.bb33_crit_edge, %bb29877 %60 = mul i32 %x, %w878 %61 = getelementptr i8, ptr %j, i32 %60879 %62 = mul i32 %x, %w880 %63 = udiv i32 %62, 2881 tail call void @llvm.memset.p0.i32(ptr %61, i8 -128, i32 %63, i1 false)882 ret void883 884return: ; preds = %bb20885 ret void886}887 888declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind889 890declare void @llvm.memset.p0.i32(ptr nocapture, i8, i32, i1) nounwind891