465 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=m68k -O0 %s -o - | FileCheck %s3 4declare zeroext i1 @get1()5declare i8 @get8()6declare i16 @get16()7declare i32 @get32()8 9define void @test_edge_detection_conditional_branch() {10; CHECK-LABEL: test_edge_detection_conditional_branch:11; CHECK: .cfi_startproc12; CHECK-NEXT: ; %bb.0: ; %start13; CHECK-NEXT: suba.l #12, %sp14; CHECK-NEXT: .cfi_def_cfa_offset -1615; CHECK-NEXT: movem.l %d2, (8,%sp) ; 8-byte Folded Spill16; CHECK-NEXT: bra .LBB0_117; CHECK-NEXT: .LBB0_1: ; %condition_check18; CHECK-NEXT: ; =>This Inner Loop Header: Depth=119; CHECK-NEXT: jsr get120; CHECK-NEXT: move.b (7,%sp), %d221; CHECK-NEXT: and.b #1, %d222; CHECK-NEXT: move.b %d0, %d123; CHECK-NEXT: sub.b %d2, %d124; CHECK-NEXT: movem.w %d0, (4,%sp)25; CHECK-NEXT: bne .LBB0_126; CHECK-NEXT: bra .LBB0_227; CHECK-NEXT: .LBB0_2: ; %do_something28; CHECK-NEXT: movem.w (4,%sp), %d029; CHECK-NEXT: move.b %d0, (7,%sp)30; CHECK-NEXT: movem.l (8,%sp), %d2 ; 8-byte Folded Reload31; CHECK-NEXT: adda.l #12, %sp32; CHECK-NEXT: rts33start:34 %prev_state = alloca [1 x i8], align 135 br label %condition_check36 37condition_check:38 %state = call zeroext i1 @get1()39 %local_prev_state = load i8, ptr %prev_state, align 140 %local_prev_state_trunc = trunc i8 %local_prev_state to i141 %result = icmp ne i1 %state, %local_prev_state_trunc42 br i1 %result, label %condition_check, label %do_something43 44do_something:45 %state_ext = zext i1 %state to i846 store i8 %state_ext, ptr %prev_state, align 147 ret void48}49 50define void @test_force_spill_8() {51; CHECK-LABEL: test_force_spill_8:52; CHECK: .cfi_startproc53; CHECK-NEXT: ; %bb.0: ; %start54; CHECK-NEXT: suba.l #108, %sp55; CHECK-NEXT: .cfi_def_cfa_offset -11256; CHECK-NEXT: movem.l %d2-%d7, (84,%sp) ; 28-byte Folded Spill57; CHECK-NEXT: jsr get858; CHECK-NEXT: movem.w %d0, (82,%sp)59; CHECK-NEXT: jsr get860; CHECK-NEXT: movem.w %d0, (66,%sp)61; CHECK-NEXT: jsr get862; CHECK-NEXT: move.b %d0, %d263; CHECK-NEXT: jsr get864; CHECK-NEXT: move.b %d0, %d365; CHECK-NEXT: jsr get866; CHECK-NEXT: move.b %d0, %d467; CHECK-NEXT: jsr get868; CHECK-NEXT: move.b %d0, %d569; CHECK-NEXT: jsr get870; CHECK-NEXT: move.b %d0, %d671; CHECK-NEXT: jsr get872; CHECK-NEXT: move.b %d0, %d773; CHECK-NEXT: jsr get874; CHECK-NEXT: movem.w %d0, (80,%sp)75; CHECK-NEXT: jsr get876; CHECK-NEXT: movem.w %d0, (78,%sp)77; CHECK-NEXT: jsr get878; CHECK-NEXT: movem.w %d0, (76,%sp)79; CHECK-NEXT: jsr get880; CHECK-NEXT: movem.w %d0, (74,%sp)81; CHECK-NEXT: jsr get882; CHECK-NEXT: movem.w %d0, (72,%sp)83; CHECK-NEXT: jsr get884; CHECK-NEXT: movem.w %d0, (70,%sp)85; CHECK-NEXT: jsr get886; CHECK-NEXT: movem.w %d0, (68,%sp)87; CHECK-NEXT: jsr get888; CHECK-NEXT: movem.w (66,%sp), %d189; CHECK-NEXT: and.l #255, %d090; CHECK-NEXT: move.l %sp, %a091; CHECK-NEXT: move.l %d0, (60,%a0)92; CHECK-NEXT: movem.w (68,%sp), %d093; CHECK-NEXT: and.l #255, %d094; CHECK-NEXT: move.l %d0, (56,%a0)95; CHECK-NEXT: movem.w (70,%sp), %d096; CHECK-NEXT: and.l #255, %d097; CHECK-NEXT: move.l %d0, (52,%a0)98; CHECK-NEXT: movem.w (72,%sp), %d099; CHECK-NEXT: and.l #255, %d0100; CHECK-NEXT: move.l %d0, (48,%a0)101; CHECK-NEXT: movem.w (74,%sp), %d0102; CHECK-NEXT: and.l #255, %d0103; CHECK-NEXT: move.l %d0, (44,%a0)104; CHECK-NEXT: movem.w (76,%sp), %d0105; CHECK-NEXT: and.l #255, %d0106; CHECK-NEXT: move.l %d0, (40,%a0)107; CHECK-NEXT: movem.w (78,%sp), %d0108; CHECK-NEXT: and.l #255, %d0109; CHECK-NEXT: move.l %d0, (36,%a0)110; CHECK-NEXT: movem.w (80,%sp), %d0111; CHECK-NEXT: and.l #255, %d0112; CHECK-NEXT: move.l %d0, (32,%a0)113; CHECK-NEXT: movem.w (82,%sp), %d0114; CHECK-NEXT: and.l #255, %d7115; CHECK-NEXT: move.l %d7, (28,%a0)116; CHECK-NEXT: and.l #255, %d6117; CHECK-NEXT: move.l %d6, (24,%a0)118; CHECK-NEXT: and.l #255, %d5119; CHECK-NEXT: move.l %d5, (20,%a0)120; CHECK-NEXT: and.l #255, %d4121; CHECK-NEXT: move.l %d4, (16,%a0)122; CHECK-NEXT: and.l #255, %d3123; CHECK-NEXT: move.l %d3, (12,%a0)124; CHECK-NEXT: and.l #255, %d2125; CHECK-NEXT: move.l %d2, (8,%a0)126; CHECK-NEXT: and.l #255, %d1127; CHECK-NEXT: move.l %d1, (4,%a0)128; CHECK-NEXT: and.l #255, %d0129; CHECK-NEXT: move.l %d0, (%a0)130; CHECK-NEXT: jsr test_force_spill_8_consumer131; CHECK-NEXT: movem.l (84,%sp), %d2-%d7 ; 28-byte Folded Reload132; CHECK-NEXT: adda.l #108, %sp133; CHECK-NEXT: rts134 start:135 %r0 = call i8 @get8()136 %r1 = call i8 @get8()137 %r2 = call i8 @get8()138 %r3 = call i8 @get8()139 %r4 = call i8 @get8()140 %r5 = call i8 @get8()141 %r6 = call i8 @get8()142 %r7 = call i8 @get8()143 %r8 = call i8 @get8()144 %r9 = call i8 @get8()145 %ra = call i8 @get8()146 %rb = call i8 @get8()147 %rc = call i8 @get8()148 %rd = call i8 @get8()149 %re = call i8 @get8()150 %rf = call i8 @get8()151 call void @test_force_spill_8_consumer(i8 %r0, i8 %r1, i8 %r2, i8 %r3, i8 %r4, i8 %r5, i8 %r6, i8 %r7, i8 %r8, i8 %r9, i8 %ra, i8 %rb, i8 %rc, i8 %rd, i8 %re, i8 %rf)152 ret void153}154 155declare void @test_force_spill_8_consumer(i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8)156 157define void @test_force_spill_16() {158; CHECK-LABEL: test_force_spill_16:159; CHECK: .cfi_startproc160; CHECK-NEXT: ; %bb.0: ; %start161; CHECK-NEXT: suba.l #116, %sp162; CHECK-NEXT: .cfi_def_cfa_offset -120163; CHECK-NEXT: movem.l %d2-%d7/%a2-%a6, (72,%sp) ; 48-byte Folded Spill164; CHECK-NEXT: jsr get16165; CHECK-NEXT: movem.w %d0, (70,%sp)166; CHECK-NEXT: jsr get16167; CHECK-NEXT: movem.w %d0, (66,%sp)168; CHECK-NEXT: jsr get16169; CHECK-NEXT: movem.w %d0, (64,%sp)170; CHECK-NEXT: jsr get16171; CHECK-NEXT: move.w %d0, %d2172; CHECK-NEXT: jsr get16173; CHECK-NEXT: move.w %d0, %d3174; CHECK-NEXT: jsr get16175; CHECK-NEXT: move.w %d0, %d4176; CHECK-NEXT: jsr get16177; CHECK-NEXT: move.w %d0, %d5178; CHECK-NEXT: jsr get16179; CHECK-NEXT: move.w %d0, %d6180; CHECK-NEXT: jsr get16181; CHECK-NEXT: move.w %d0, %d7182; CHECK-NEXT: jsr get16183; CHECK-NEXT: move.w %d0, %a2184; CHECK-NEXT: jsr get16185; CHECK-NEXT: move.w %d0, %a3186; CHECK-NEXT: jsr get16187; CHECK-NEXT: move.w %d0, %a4188; CHECK-NEXT: jsr get16189; CHECK-NEXT: move.w %d0, %a5190; CHECK-NEXT: jsr get16191; CHECK-NEXT: move.w %d0, %a6192; CHECK-NEXT: jsr get16193; CHECK-NEXT: movem.w %d0, (68,%sp)194; CHECK-NEXT: jsr get16195; CHECK-NEXT: movem.w (64,%sp), %a1196; CHECK-NEXT: movem.w (66,%sp), %d1197; CHECK-NEXT: and.l #65535, %d0198; CHECK-NEXT: move.l %sp, %a0199; CHECK-NEXT: move.l %d0, (60,%a0)200; CHECK-NEXT: movem.w (68,%sp), %d0201; CHECK-NEXT: and.l #65535, %d0202; CHECK-NEXT: move.l %d0, (56,%a0)203; CHECK-NEXT: movem.w (70,%sp), %d0204; CHECK-NEXT: and.l #65535, %a6205; CHECK-NEXT: move.l %a6, (52,%a0)206; CHECK-NEXT: and.l #65535, %a5207; CHECK-NEXT: move.l %a5, (48,%a0)208; CHECK-NEXT: and.l #65535, %a4209; CHECK-NEXT: move.l %a4, (44,%a0)210; CHECK-NEXT: and.l #65535, %a3211; CHECK-NEXT: move.l %a3, (40,%a0)212; CHECK-NEXT: and.l #65535, %a2213; CHECK-NEXT: move.l %a2, (36,%a0)214; CHECK-NEXT: and.l #65535, %d7215; CHECK-NEXT: move.l %d7, (32,%a0)216; CHECK-NEXT: and.l #65535, %d6217; CHECK-NEXT: move.l %d6, (28,%a0)218; CHECK-NEXT: and.l #65535, %d5219; CHECK-NEXT: move.l %d5, (24,%a0)220; CHECK-NEXT: and.l #65535, %d4221; CHECK-NEXT: move.l %d4, (20,%a0)222; CHECK-NEXT: and.l #65535, %d3223; CHECK-NEXT: move.l %d3, (16,%a0)224; CHECK-NEXT: and.l #65535, %d2225; CHECK-NEXT: move.l %d2, (12,%a0)226; CHECK-NEXT: and.l #65535, %a1227; CHECK-NEXT: move.l %a1, (8,%a0)228; CHECK-NEXT: and.l #65535, %d1229; CHECK-NEXT: move.l %d1, (4,%a0)230; CHECK-NEXT: and.l #65535, %d0231; CHECK-NEXT: move.l %d0, (%a0)232; CHECK-NEXT: jsr test_force_spill_16_consumer233; CHECK-NEXT: movem.l (72,%sp), %d2-%d7/%a2-%a6 ; 48-byte Folded Reload234; CHECK-NEXT: adda.l #116, %sp235; CHECK-NEXT: rts236 start:237 %r0 = call i16 @get16()238 %r1 = call i16 @get16()239 %r2 = call i16 @get16()240 %r3 = call i16 @get16()241 %r4 = call i16 @get16()242 %r5 = call i16 @get16()243 %r6 = call i16 @get16()244 %r7 = call i16 @get16()245 %r8 = call i16 @get16()246 %r9 = call i16 @get16()247 %ra = call i16 @get16()248 %rb = call i16 @get16()249 %rc = call i16 @get16()250 %rd = call i16 @get16()251 %re = call i16 @get16()252 %rf = call i16 @get16()253 call void @test_force_spill_16_consumer(i16 %r0, i16 %r1, i16 %r2, i16 %r3, i16 %r4, i16 %r5, i16 %r6, i16 %r7, i16 %r8, i16 %r9, i16 %ra, i16 %rb, i16 %rc, i16 %rd, i16 %re, i16 %rf)254 ret void255}256 257declare void @test_force_spill_16_consumer(i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16)258 259define void @test_force_spill_32() {260; CHECK-LABEL: test_force_spill_32:261; CHECK: .cfi_startproc262; CHECK-NEXT: ; %bb.0: ; %start263; CHECK-NEXT: suba.l #124, %sp264; CHECK-NEXT: .cfi_def_cfa_offset -128265; CHECK-NEXT: movem.l %d2-%d7/%a2-%a6, (80,%sp) ; 48-byte Folded Spill266; CHECK-NEXT: jsr get32267; CHECK-NEXT: movem.l %d0, (76,%sp)268; CHECK-NEXT: jsr get32269; CHECK-NEXT: movem.l %d0, (68,%sp)270; CHECK-NEXT: jsr get32271; CHECK-NEXT: movem.l %d0, (64,%sp)272; CHECK-NEXT: jsr get32273; CHECK-NEXT: move.l %d0, %d2274; CHECK-NEXT: jsr get32275; CHECK-NEXT: move.l %d0, %d3276; CHECK-NEXT: jsr get32277; CHECK-NEXT: move.l %d0, %d4278; CHECK-NEXT: jsr get32279; CHECK-NEXT: move.l %d0, %d5280; CHECK-NEXT: jsr get32281; CHECK-NEXT: move.l %d0, %d6282; CHECK-NEXT: jsr get32283; CHECK-NEXT: move.l %d0, %d7284; CHECK-NEXT: jsr get32285; CHECK-NEXT: move.l %d0, %a2286; CHECK-NEXT: jsr get32287; CHECK-NEXT: move.l %d0, %a3288; CHECK-NEXT: jsr get32289; CHECK-NEXT: move.l %d0, %a4290; CHECK-NEXT: jsr get32291; CHECK-NEXT: move.l %d0, %a5292; CHECK-NEXT: jsr get32293; CHECK-NEXT: move.l %d0, %a6294; CHECK-NEXT: jsr get32295; CHECK-NEXT: movem.l %d0, (72,%sp)296; CHECK-NEXT: jsr get32297; CHECK-NEXT: movem.l (64,%sp), %a1298; CHECK-NEXT: movem.l (68,%sp), %d1299; CHECK-NEXT: move.l %sp, %a0300; CHECK-NEXT: move.l %d0, (60,%a0)301; CHECK-NEXT: movem.l (72,%sp), %d0302; CHECK-NEXT: move.l %d0, (56,%a0)303; CHECK-NEXT: movem.l (76,%sp), %d0304; CHECK-NEXT: move.l %a6, (52,%a0)305; CHECK-NEXT: move.l %a5, (48,%a0)306; CHECK-NEXT: move.l %a4, (44,%a0)307; CHECK-NEXT: move.l %a3, (40,%a0)308; CHECK-NEXT: move.l %a2, (36,%a0)309; CHECK-NEXT: move.l %d7, (32,%a0)310; CHECK-NEXT: move.l %d6, (28,%a0)311; CHECK-NEXT: move.l %d5, (24,%a0)312; CHECK-NEXT: move.l %d4, (20,%a0)313; CHECK-NEXT: move.l %d3, (16,%a0)314; CHECK-NEXT: move.l %d2, (12,%a0)315; CHECK-NEXT: move.l %a1, (8,%a0)316; CHECK-NEXT: move.l %d1, (4,%a0)317; CHECK-NEXT: move.l %d0, (%a0)318; CHECK-NEXT: jsr test_force_spill_32_consumer319; CHECK-NEXT: movem.l (80,%sp), %d2-%d7/%a2-%a6 ; 48-byte Folded Reload320; CHECK-NEXT: adda.l #124, %sp321; CHECK-NEXT: rts322 start:323 %r0 = call i32 @get32()324 %r1 = call i32 @get32()325 %r2 = call i32 @get32()326 %r3 = call i32 @get32()327 %r4 = call i32 @get32()328 %r5 = call i32 @get32()329 %r6 = call i32 @get32()330 %r7 = call i32 @get32()331 %r8 = call i32 @get32()332 %r9 = call i32 @get32()333 %ra = call i32 @get32()334 %rb = call i32 @get32()335 %rc = call i32 @get32()336 %rd = call i32 @get32()337 %re = call i32 @get32()338 %rf = call i32 @get32()339 call void @test_force_spill_32_consumer(i32 %r0, i32 %r1, i32 %r2, i32 %r3, i32 %r4, i32 %r5, i32 %r6, i32 %r7, i32 %r8, i32 %r9, i32 %ra, i32 %rb, i32 %rc, i32 %rd, i32 %re, i32 %rf)340 ret void341}342 343declare void @test_force_spill_32_consumer(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32)344 345define void @test_force_spill_mixed() {346; CHECK-LABEL: test_force_spill_mixed:347; CHECK: .cfi_startproc348; CHECK-NEXT: ; %bb.0: ; %start349; CHECK-NEXT: suba.l #148, %sp350; CHECK-NEXT: .cfi_def_cfa_offset -152351; CHECK-NEXT: movem.l %d2-%d7/%a2-%a6, (104,%sp) ; 48-byte Folded Spill352; CHECK-NEXT: jsr get8353; CHECK-NEXT: movem.w %d0, (102,%sp)354; CHECK-NEXT: jsr get16355; CHECK-NEXT: movem.w %d0, (86,%sp)356; CHECK-NEXT: jsr get32357; CHECK-NEXT: movem.l %d0, (80,%sp)358; CHECK-NEXT: jsr get16359; CHECK-NEXT: move.w %d0, %d2360; CHECK-NEXT: jsr get8361; CHECK-NEXT: move.b %d0, %d3362; CHECK-NEXT: jsr get16363; CHECK-NEXT: move.w %d0, %d4364; CHECK-NEXT: jsr get32365; CHECK-NEXT: move.l %d0, %d5366; CHECK-NEXT: jsr get16367; CHECK-NEXT: move.w %d0, %d6368; CHECK-NEXT: jsr get8369; CHECK-NEXT: move.b %d0, %d7370; CHECK-NEXT: jsr get16371; CHECK-NEXT: move.w %d0, %a2372; CHECK-NEXT: jsr get32373; CHECK-NEXT: move.l %d0, %a3374; CHECK-NEXT: jsr get16375; CHECK-NEXT: move.w %d0, %a4376; CHECK-NEXT: jsr get8377; CHECK-NEXT: movem.w %d0, (100,%sp)378; CHECK-NEXT: jsr get16379; CHECK-NEXT: move.w %d0, %a5380; CHECK-NEXT: jsr get32381; CHECK-NEXT: move.l %d0, %a6382; CHECK-NEXT: jsr get16383; CHECK-NEXT: movem.w %d0, (98,%sp)384; CHECK-NEXT: jsr get8385; CHECK-NEXT: movem.w %d0, (96,%sp)386; CHECK-NEXT: jsr get16387; CHECK-NEXT: movem.w %d0, (94,%sp)388; CHECK-NEXT: jsr get32389; CHECK-NEXT: movem.l %d0, (88,%sp)390; CHECK-NEXT: jsr get16391; CHECK-NEXT: movem.l (80,%sp), %a1392; CHECK-NEXT: movem.w (86,%sp), %d1393; CHECK-NEXT: and.l #65535, %d0394; CHECK-NEXT: move.l %sp, %a0395; CHECK-NEXT: move.l %d0, (76,%a0)396; CHECK-NEXT: movem.l (88,%sp), %d0397; CHECK-NEXT: move.l %d0, (72,%a0)398; CHECK-NEXT: movem.w (94,%sp), %d0399; CHECK-NEXT: and.l #65535, %d0400; CHECK-NEXT: move.l %d0, (68,%a0)401; CHECK-NEXT: movem.w (96,%sp), %d0402; CHECK-NEXT: and.l #255, %d0403; CHECK-NEXT: move.l %d0, (64,%a0)404; CHECK-NEXT: movem.w (98,%sp), %d0405; CHECK-NEXT: and.l #65535, %d0406; CHECK-NEXT: move.l %d0, (60,%a0)407; CHECK-NEXT: movem.w (100,%sp), %d0408; CHECK-NEXT: move.l %a6, (56,%a0)409; CHECK-NEXT: and.l #65535, %a5410; CHECK-NEXT: move.l %a5, (52,%a0)411; CHECK-NEXT: and.l #255, %d0412; CHECK-NEXT: move.l %d0, (48,%a0)413; CHECK-NEXT: movem.w (102,%sp), %d0414; CHECK-NEXT: and.l #65535, %a4415; CHECK-NEXT: move.l %a4, (44,%a0)416; CHECK-NEXT: move.l %a3, (40,%a0)417; CHECK-NEXT: and.l #65535, %a2418; CHECK-NEXT: move.l %a2, (36,%a0)419; CHECK-NEXT: and.l #255, %d7420; CHECK-NEXT: move.l %d7, (32,%a0)421; CHECK-NEXT: and.l #65535, %d6422; CHECK-NEXT: move.l %d6, (28,%a0)423; CHECK-NEXT: move.l %d5, (24,%a0)424; CHECK-NEXT: and.l #65535, %d4425; CHECK-NEXT: move.l %d4, (20,%a0)426; CHECK-NEXT: and.l #255, %d3427; CHECK-NEXT: move.l %d3, (16,%a0)428; CHECK-NEXT: and.l #65535, %d2429; CHECK-NEXT: move.l %d2, (12,%a0)430; CHECK-NEXT: move.l %a1, (8,%a0)431; CHECK-NEXT: and.l #65535, %d1432; CHECK-NEXT: move.l %d1, (4,%a0)433; CHECK-NEXT: and.l #255, %d0434; CHECK-NEXT: move.l %d0, (%a0)435; CHECK-NEXT: jsr test_force_spill_mixed_consumer436; CHECK-NEXT: movem.l (104,%sp), %d2-%d7/%a2-%a6 ; 48-byte Folded Reload437; CHECK-NEXT: adda.l #148, %sp438; CHECK-NEXT: rts439 start:440 %r0 = call i8 @get8()441 %r1 = call i16 @get16()442 %r2 = call i32 @get32()443 %r3 = call i16 @get16()444 %r4 = call i8 @get8()445 %r5 = call i16 @get16()446 %r6 = call i32 @get32()447 %r7 = call i16 @get16()448 %r8 = call i8 @get8()449 %r9 = call i16 @get16()450 %ra = call i32 @get32()451 %rb = call i16 @get16()452 %rc = call i8 @get8()453 %rd = call i16 @get16()454 %re = call i32 @get32()455 %rf = call i16 @get16()456 %rg = call i8 @get8()457 %rh = call i16 @get16()458 %ri = call i32 @get32()459 %rj = call i16 @get16()460 call void @test_force_spill_mixed_consumer(i8 %r0, i16 %r1, i32 %r2, i16 %r3, i8 %r4, i16 %r5, i32 %r6, i16 %r7, i8 %r8, i16 %r9, i32 %ra, i16 %rb, i8 %rc, i16 %rd, i32 %re, i16 %rf, i8 %rg, i16 %rh, i32 %ri, i16 %rj)461 ret void462}463 464declare void @test_force_spill_mixed_consumer(i8, i16, i32, i16, i8, i16, i32, i16, i8, i16, i32, i16, i8, i16, i32, i16, i8, i16, i32, i16)465