brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.2 KiB · 348f3a3 Raw
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