brintos

brintos / llvm-project-archived public Read only

0
0
Text · 31.8 KiB · b6af7e1 Raw
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