231 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-unknown-linux-gnu | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefix=X644 5@a = common dso_local global i32 0, align 46@b = common dso_local global i32 0, align 47@c = common dso_local global i32 0, align 48@e = common dso_local global i32 0, align 49@x = common dso_local global i32 0, align 410@f = common dso_local global i32 0, align 411@h = common dso_local global i32 0, align 412@i = common dso_local global i32 0, align 413 14; Test -Os to make sure immediates with multiple users don't get pulled in to15; instructions (8-bit immediates are exceptions).16 17define dso_local i32 @foo() optsize {18; X86-LABEL: foo:19; X86: # %bb.0: # %entry20; X86-NEXT: movl $1234, %eax # imm = 0x4D221; X86-NEXT: movl %eax, a22; X86-NEXT: movl %eax, b23; X86-NEXT: movl $12, c24; X86-NEXT: cmpl $12, e25; X86-NEXT: jne .LBB0_226; X86-NEXT: # %bb.1: # %if.then27; X86-NEXT: movl $1, x28; X86-NEXT: .LBB0_2: # %if.end29; X86-NEXT: movl $1234, f # imm = 0x4D230; X86-NEXT: movl $555, %eax # imm = 0x22B31; X86-NEXT: movl %eax, h32; X86-NEXT: addl %eax, i33; X86-NEXT: xorl %eax, %eax34; X86-NEXT: retl35;36; X64-LABEL: foo:37; X64: # %bb.0: # %entry38; X64-NEXT: movl $1234, %eax # imm = 0x4D239; X64-NEXT: movl %eax, a(%rip)40; X64-NEXT: movl %eax, b(%rip)41; X64-NEXT: movl $12, c(%rip)42; X64-NEXT: cmpl $12, e(%rip)43; X64-NEXT: jne .LBB0_244; X64-NEXT: # %bb.1: # %if.then45; X64-NEXT: movl $1, x(%rip)46; X64-NEXT: .LBB0_2: # %if.end47; X64-NEXT: movl $1234, f(%rip) # imm = 0x4D248; X64-NEXT: movl $555, %eax # imm = 0x22B49; X64-NEXT: movl %eax, h(%rip)50; X64-NEXT: addl %eax, i(%rip)51; X64-NEXT: xorl %eax, %eax52; X64-NEXT: retq53entry:54 store i32 1234, ptr @a55 store i32 1234, ptr @b56 store i32 12, ptr @c57 %0 = load i32, ptr @e58 %cmp = icmp eq i32 %0, 1259 br i1 %cmp, label %if.then, label %if.end60 61if.then: ; preds = %entry62 store i32 1, ptr @x63 br label %if.end64 65; New block.. Make sure 1234 isn't live across basic blocks from before.66if.end: ; preds = %if.then, %entry67 store i32 1234, ptr @f68 store i32 555, ptr @h69 %1 = load i32, ptr @i70 %add1 = add nsw i32 %1, 55571 store i32 %add1, ptr @i72 ret i32 073}74 75; Test PGSO to make sure immediates with multiple users don't get pulled in to76; instructions (8-bit immediates are exceptions).77 78define dso_local i32 @foo_pgso() !prof !14 {79; X86-LABEL: foo_pgso:80; X86: # %bb.0: # %entry81; X86-NEXT: movl $1234, %eax # imm = 0x4D282; X86-NEXT: movl %eax, a83; X86-NEXT: movl %eax, b84; X86-NEXT: movl $12, c85; X86-NEXT: cmpl $12, e86; X86-NEXT: jne .LBB1_287; X86-NEXT: # %bb.1: # %if.then88; X86-NEXT: movl $1, x89; X86-NEXT: .LBB1_2: # %if.end90; X86-NEXT: movl $1234, f # imm = 0x4D291; X86-NEXT: movl $555, %eax # imm = 0x22B92; X86-NEXT: movl %eax, h93; X86-NEXT: addl %eax, i94; X86-NEXT: xorl %eax, %eax95; X86-NEXT: retl96;97; X64-LABEL: foo_pgso:98; X64: # %bb.0: # %entry99; X64-NEXT: movl $1234, %eax # imm = 0x4D2100; X64-NEXT: movl %eax, a(%rip)101; X64-NEXT: movl %eax, b(%rip)102; X64-NEXT: movl $12, c(%rip)103; X64-NEXT: cmpl $12, e(%rip)104; X64-NEXT: jne .LBB1_2105; X64-NEXT: # %bb.1: # %if.then106; X64-NEXT: movl $1, x(%rip)107; X64-NEXT: .LBB1_2: # %if.end108; X64-NEXT: movl $1234, f(%rip) # imm = 0x4D2109; X64-NEXT: movl $555, %eax # imm = 0x22B110; X64-NEXT: movl %eax, h(%rip)111; X64-NEXT: addl %eax, i(%rip)112; X64-NEXT: xorl %eax, %eax113; X64-NEXT: retq114entry:115 store i32 1234, ptr @a116 store i32 1234, ptr @b117 store i32 12, ptr @c118 %0 = load i32, ptr @e119 %cmp = icmp eq i32 %0, 12120 br i1 %cmp, label %if.then, label %if.end121 122if.then: ; preds = %entry123 store i32 1, ptr @x124 br label %if.end125 126; New block.. Make sure 1234 isn't live across basic blocks from before.127if.end: ; preds = %if.then, %entry128 store i32 1234, ptr @f129 store i32 555, ptr @h130 %1 = load i32, ptr @i131 %add1 = add nsw i32 %1, 555132 store i32 %add1, ptr @i133 ret i32 0134}135 136; Test -O2 to make sure that all immediates get pulled in to their users.137define dso_local i32 @foo2() {138; X86-LABEL: foo2:139; X86: # %bb.0: # %entry140; X86-NEXT: movl $1234, a # imm = 0x4D2141; X86-NEXT: movl $1234, b # imm = 0x4D2142; X86-NEXT: xorl %eax, %eax143; X86-NEXT: retl144;145; X64-LABEL: foo2:146; X64: # %bb.0: # %entry147; X64-NEXT: movl $1234, a(%rip) # imm = 0x4D2148; X64-NEXT: movl $1234, b(%rip) # imm = 0x4D2149; X64-NEXT: xorl %eax, %eax150; X64-NEXT: retq151entry:152 store i32 1234, ptr @a153 store i32 1234, ptr @b154 ret i32 0155}156 157declare void @llvm.memset.p0.i32(ptr nocapture, i8, i32, i1) #1158 159@AA = common dso_local global [100 x i8] zeroinitializer, align 1160 161; memset gets lowered in DAG. Constant merging should hoist all the162; immediates used to store to the individual memory locations. Make163; sure we don't directly store the immediates.164define dso_local void @foomemset() optsize {165; X86-LABEL: foomemset:166; X86: # %bb.0: # %entry167; X86-NEXT: movl $555819297, %eax # imm = 0x21212121168; X86-NEXT: movl %eax, AA+20169; X86-NEXT: movl %eax, AA+16170; X86-NEXT: movl %eax, AA+12171; X86-NEXT: movl %eax, AA+8172; X86-NEXT: movl %eax, AA+4173; X86-NEXT: movl %eax, AA174; X86-NEXT: retl175;176; X64-LABEL: foomemset:177; X64: # %bb.0: # %entry178; X64-NEXT: movabsq $2387225703656530209, %rax # imm = 0x2121212121212121179; X64-NEXT: movq %rax, AA+16(%rip)180; X64-NEXT: movq %rax, AA+8(%rip)181; X64-NEXT: movq %rax, AA(%rip)182; X64-NEXT: retq183entry:184 call void @llvm.memset.p0.i32(ptr @AA, i8 33, i32 24, i1 false)185 ret void186}187 188; memset gets lowered in DAG. Constant merging should hoist all the189; immediates used to store to the individual memory locations. Make190; sure we don't directly store the immediates.191define dso_local void @foomemset_pgso() !prof !14 {192; X86-LABEL: foomemset_pgso:193; X86: # %bb.0: # %entry194; X86-NEXT: movl $555819297, %eax # imm = 0x21212121195; X86-NEXT: movl %eax, AA+20196; X86-NEXT: movl %eax, AA+16197; X86-NEXT: movl %eax, AA+12198; X86-NEXT: movl %eax, AA+8199; X86-NEXT: movl %eax, AA+4200; X86-NEXT: movl %eax, AA201; X86-NEXT: retl202;203; X64-LABEL: foomemset_pgso:204; X64: # %bb.0: # %entry205; X64-NEXT: movabsq $2387225703656530209, %rax # imm = 0x2121212121212121206; X64-NEXT: movq %rax, AA+16(%rip)207; X64-NEXT: movq %rax, AA+8(%rip)208; X64-NEXT: movq %rax, AA(%rip)209; X64-NEXT: retq210entry:211 call void @llvm.memset.p0.i32(ptr @AA, i8 33, i32 24, i1 false)212 ret void213}214 215!llvm.module.flags = !{!0}216!0 = !{i32 1, !"ProfileSummary", !1}217!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}218!2 = !{!"ProfileFormat", !"InstrProf"}219!3 = !{!"TotalCount", i64 10000}220!4 = !{!"MaxCount", i64 10}221!5 = !{!"MaxInternalCount", i64 1}222!6 = !{!"MaxFunctionCount", i64 1000}223!7 = !{!"NumCounts", i64 3}224!8 = !{!"NumFunctions", i64 3}225!9 = !{!"DetailedSummary", !10}226!10 = !{!11, !12, !13}227!11 = !{i32 10000, i64 100, i32 1}228!12 = !{i32 999000, i64 100, i32 1}229!13 = !{i32 999999, i64 1, i32 2}230!14 = !{!"function_entry_count", i64 0}231