251 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64 -relocation-model=static < %s | FileCheck --check-prefixes=STATIC %s3; RUN: llc -mtriple=x86_64 -relocation-model=pic < %s | FileCheck --check-prefixes=PIC %s4; RUN: llc -mtriple=x86_64 -code-model=medium -relocation-model=static < %s | FileCheck --check-prefixes=MSTATIC %s5; RUN: llc -mtriple=x86_64 -code-model=medium -relocation-model=pic < %s | FileCheck --check-prefixes=MPIC %s6 7@foo = internal global i32 08 9define dso_local i64 @zero() #0 {10; STATIC-LABEL: zero:11; STATIC: # %bb.0: # %entry12; STATIC-NEXT: movl $foo, %eax13; STATIC-NEXT: retq14;15; PIC-LABEL: zero:16; PIC: # %bb.0: # %entry17; PIC-NEXT: leaq foo(%rip), %rax18; PIC-NEXT: retq19;20; MSTATIC-LABEL: zero:21; MSTATIC: # %bb.0: # %entry22; MSTATIC-NEXT: movabsq $foo, %rax23; MSTATIC-NEXT: retq24;25; MPIC-LABEL: zero:26; MPIC: # %bb.0: # %entry27; MPIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx28; MPIC-NEXT: movabsq $foo@GOTOFF, %rax29; MPIC-NEXT: addq %rcx, %rax30; MPIC-NEXT: retq31entry:32 ret i64 add (i64 ptrtoint (ptr @foo to i64), i64 0)33}34 35define dso_local i64 @one() #0 {36; STATIC-LABEL: one:37; STATIC: # %bb.0: # %entry38; STATIC-NEXT: movl $foo+1, %eax39; STATIC-NEXT: retq40;41; PIC-LABEL: one:42; PIC: # %bb.0: # %entry43; PIC-NEXT: leaq foo+1(%rip), %rax44; PIC-NEXT: retq45;46; MSTATIC-LABEL: one:47; MSTATIC: # %bb.0: # %entry48; MSTATIC-NEXT: movabsq $foo+1, %rax49; MSTATIC-NEXT: retq50;51; MPIC-LABEL: one:52; MPIC: # %bb.0: # %entry53; MPIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax54; MPIC-NEXT: movabsq $foo@GOTOFF, %rcx55; MPIC-NEXT: leaq 1(%rax,%rcx), %rax56; MPIC-NEXT: retq57entry:58 ret i64 add (i64 ptrtoint (ptr @foo to i64), i64 1)59}60 61;; Check we don't fold a large offset into leaq, otherwise62;; the large r_addend can easily cause a relocation overflow.63define dso_local i64 @large() #0 {64; STATIC-LABEL: large:65; STATIC: # %bb.0: # %entry66; STATIC-NEXT: movl $1701208431, %eax # imm = 0x6566616F67; STATIC-NEXT: leaq foo(%rax), %rax68; STATIC-NEXT: retq69;70; PIC-LABEL: large:71; PIC: # %bb.0: # %entry72; PIC-NEXT: leaq foo(%rip), %rax73; PIC-NEXT: addq $1701208431, %rax # imm = 0x6566616F74; PIC-NEXT: retq75;76; MSTATIC-LABEL: large:77; MSTATIC: # %bb.0: # %entry78; MSTATIC-NEXT: movabsq $foo, %rax79; MSTATIC-NEXT: addq $1701208431, %rax # imm = 0x6566616F80; MSTATIC-NEXT: retq81;82; MPIC-LABEL: large:83; MPIC: # %bb.0: # %entry84; MPIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax85; MPIC-NEXT: movabsq $foo@GOTOFF, %rcx86; MPIC-NEXT: leaq 1701208431(%rax,%rcx), %rax87; MPIC-NEXT: retq88entry:89 ret i64 add (i64 ptrtoint (ptr @foo to i64), i64 1701208431)90}91 92;; Test we don't emit movl foo-1, %eax. ELF R_X86_64_32 does not allow93;; a negative value.94define dso_local i64 @neg_1() #0 {95; STATIC-LABEL: neg_1:96; STATIC: # %bb.0: # %entry97; STATIC-NEXT: leaq foo-1(%rip), %rax98; STATIC-NEXT: retq99;100; PIC-LABEL: neg_1:101; PIC: # %bb.0: # %entry102; PIC-NEXT: leaq foo-1(%rip), %rax103; PIC-NEXT: retq104;105; MSTATIC-LABEL: neg_1:106; MSTATIC: # %bb.0: # %entry107; MSTATIC-NEXT: movabsq $foo, %rax108; MSTATIC-NEXT: decq %rax109; MSTATIC-NEXT: retq110;111; MPIC-LABEL: neg_1:112; MPIC: # %bb.0: # %entry113; MPIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax114; MPIC-NEXT: movabsq $foo@GOTOFF, %rcx115; MPIC-NEXT: leaq -1(%rax,%rcx), %rax116; MPIC-NEXT: retq117entry:118 ret i64 add (i64 ptrtoint (ptr @foo to i64), i64 -1)119}120 121;; Test we don't emit movl foo-2147483648, %eax. ELF R_X86_64_32 does not allow122;; a negative value.123define dso_local i64 @neg_0x80000000() #0 {124; STATIC-LABEL: neg_0x80000000:125; STATIC: # %bb.0: # %entry126; STATIC-NEXT: leaq foo-2147483648(%rip), %rax127; STATIC-NEXT: retq128;129; PIC-LABEL: neg_0x80000000:130; PIC: # %bb.0: # %entry131; PIC-NEXT: leaq foo-2147483648(%rip), %rax132; PIC-NEXT: retq133;134; MSTATIC-LABEL: neg_0x80000000:135; MSTATIC: # %bb.0: # %entry136; MSTATIC-NEXT: movabsq $foo, %rax137; MSTATIC-NEXT: addq $-2147483648, %rax # imm = 0x80000000138; MSTATIC-NEXT: retq139;140; MPIC-LABEL: neg_0x80000000:141; MPIC: # %bb.0: # %entry142; MPIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax143; MPIC-NEXT: movabsq $foo@GOTOFF, %rcx144; MPIC-NEXT: leaq -2147483648(%rax,%rcx), %rax145; MPIC-NEXT: retq146entry:147 ret i64 add (i64 ptrtoint (ptr @foo to i64), i64 -2147483648)148}149 150define dso_local i64 @neg_0x80000001() #0 {151; STATIC-LABEL: neg_0x80000001:152; STATIC: # %bb.0: # %entry153; STATIC-NEXT: movabsq $-2147483649, %rax # imm = 0xFFFFFFFF7FFFFFFF154; STATIC-NEXT: leaq foo(%rax), %rax155; STATIC-NEXT: retq156;157; PIC-LABEL: neg_0x80000001:158; PIC: # %bb.0: # %entry159; PIC-NEXT: leaq foo(%rip), %rcx160; PIC-NEXT: movabsq $-2147483649, %rax # imm = 0xFFFFFFFF7FFFFFFF161; PIC-NEXT: addq %rcx, %rax162; PIC-NEXT: retq163;164; MSTATIC-LABEL: neg_0x80000001:165; MSTATIC: # %bb.0: # %entry166; MSTATIC-NEXT: movabsq $-2147483649, %rcx # imm = 0xFFFFFFFF7FFFFFFF167; MSTATIC-NEXT: movabsq $foo, %rax168; MSTATIC-NEXT: addq %rcx, %rax169; MSTATIC-NEXT: retq170;171; MPIC-LABEL: neg_0x80000001:172; MPIC: # %bb.0: # %entry173; MPIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax174; MPIC-NEXT: movabsq $foo@GOTOFF, %rcx175; MPIC-NEXT: addq %rax, %rcx176; MPIC-NEXT: movabsq $-2147483649, %rax # imm = 0xFFFFFFFF7FFFFFFF177; MPIC-NEXT: addq %rcx, %rax178; MPIC-NEXT: retq179entry:180 ret i64 add (i64 ptrtoint (ptr @foo to i64), i64 -2147483649)181}182 183define internal void @bar() #0 {184; STATIC-LABEL: bar:185; STATIC: # %bb.0:186; STATIC-NEXT: retq187;188; PIC-LABEL: bar:189; PIC: # %bb.0:190; PIC-NEXT: retq191;192; MSTATIC-LABEL: bar:193; MSTATIC: # %bb.0:194; MSTATIC-NEXT: retq195;196; MPIC-LABEL: bar:197; MPIC: # %bb.0:198; MPIC-NEXT: retq199 ret void200}201 202define dso_local i64 @fun_neg_0xfeffffff() #0 {203; STATIC-LABEL: fun_neg_0xfeffffff:204; STATIC: # %bb.0:205; STATIC-NEXT: movl $bar, %eax206; STATIC-NEXT: addq $-16777217, %rax # imm = 0xFEFFFFFF207; STATIC-NEXT: retq208;209; PIC-LABEL: fun_neg_0xfeffffff:210; PIC: # %bb.0:211; PIC-NEXT: leaq bar-16777217(%rip), %rax212; PIC-NEXT: retq213;214; MSTATIC-LABEL: fun_neg_0xfeffffff:215; MSTATIC: # %bb.0:216; MSTATIC-NEXT: movl $bar, %eax217; MSTATIC-NEXT: addq $-16777217, %rax # imm = 0xFEFFFFFF218; MSTATIC-NEXT: retq219;220; MPIC-LABEL: fun_neg_0xfeffffff:221; MPIC: # %bb.0:222; MPIC-NEXT: leaq bar-16777217(%rip), %rax223; MPIC-NEXT: retq224 ret i64 add (i64 ptrtoint (ptr @bar to i64), i64 -16777217)225}226 227define dso_local i64 @fun_neg_ff000000() #0 {228; STATIC-LABEL: fun_neg_ff000000:229; STATIC: # %bb.0:230; STATIC-NEXT: leaq bar-16777216(%rip), %rax231; STATIC-NEXT: retq232;233; PIC-LABEL: fun_neg_ff000000:234; PIC: # %bb.0:235; PIC-NEXT: leaq bar-16777216(%rip), %rax236; PIC-NEXT: retq237;238; MSTATIC-LABEL: fun_neg_ff000000:239; MSTATIC: # %bb.0:240; MSTATIC-NEXT: leaq bar-16777216(%rip), %rax241; MSTATIC-NEXT: retq242;243; MPIC-LABEL: fun_neg_ff000000:244; MPIC: # %bb.0:245; MPIC-NEXT: leaq bar-16777216(%rip), %rax246; MPIC-NEXT: retq247 ret i64 add (i64 ptrtoint (ptr @bar to i64), i64 -16777216)248}249 250attributes #0 = { nounwind }251