brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.8 KiB · c997d31 Raw
380 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s | FileCheck %s --check-prefixes=ALL,CHECK3; RUN: llc -O0 < %s | FileCheck %s --check-prefixes=ALL,CHECK-O04 5; Source to regenerate:6; struct Foo {7;   int * __ptr32 p32;8;   int * __ptr64 p64;9;   __attribute__((address_space(9))) int *p_other;10; };11; void use_foo(Foo *f);12; void test_sign_ext(Foo *f, int * __ptr32 __sptr i) {13;   f->p64 = i;14;   use_foo(f);15; }16; void test_zero_ext(Foo *f, int * __ptr32 __uptr i) {17;   f->p64 = i;18;   use_foo(f);19; }20; void test_trunc(Foo *f, int * __ptr64 i) {21;   f->p32 = i;22;   use_foo(f);23; }24; void test_noop1(Foo *f, int * __ptr32 i) {25;   f->p32 = i;26;   use_foo(f);27; }28; void test_noop2(Foo *f, int * __ptr64 i) {29;   f->p64 = i;30;   use_foo(f);31; }32; void test_null_arg(Foo *f) {33;   test_noop2(f, 0);34; }35; void test_unrecognized(Foo *f, __attribute__((address_space(14))) int *i) {36;   f->p64 = (int * __ptr64)i;37;   use_foo(f);38; }39; void test_unrecognized2(Foo *f, int * __ptr64 i) {40;   f->p_other = i;41;   use_foo(f);42; }43;44; $ clang -cc1 -triple x86_64-windows-msvc -fms-extensions -O2 -S t.cpp45 46target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-a:0:32-S32"47target triple = "i686-unknown-windows-msvc"48 49%struct.Foo = type { ptr, ptr addrspace(272), ptr addrspace(9) }50declare dso_local void @use_foo(ptr)51 52define dso_local void @test_sign_ext(ptr %f, ptr %i) {53; CHECK-LABEL: test_sign_ext:54; CHECK:       # %bb.0: # %entry55; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax56; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx57; CHECK-NEXT:    movl %ecx, 8(%eax)58; CHECK-NEXT:    sarl $31, %ecx59; CHECK-NEXT:    movl %ecx, 12(%eax)60; CHECK-NEXT:    jmp _use_foo # TAILCALL61;62; CHECK-O0-LABEL: test_sign_ext:63; CHECK-O0:       # %bb.0: # %entry64; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %edx65; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax66; CHECK-O0-NEXT:    movl %edx, %ecx67; CHECK-O0-NEXT:    sarl $31, %ecx68; CHECK-O0-NEXT:    movl %edx, 8(%eax)69; CHECK-O0-NEXT:    movl %ecx, 12(%eax)70; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL71entry:72  %0 = addrspacecast ptr %i to ptr addrspace(272)73  %p64 = getelementptr inbounds %struct.Foo, ptr %f, i32 0, i32 174  store ptr addrspace(272) %0, ptr %p64, align 875  tail call void @use_foo(ptr %f)76  ret void77}78 79define dso_local void @test_zero_ext(ptr %f, ptr addrspace(271) %i) {80; CHECK-LABEL: test_zero_ext:81; CHECK:       # %bb.0: # %entry82; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax83; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx84; CHECK-NEXT:    movl %eax, 8(%ecx)85; CHECK-NEXT:    movl $0, 12(%ecx)86; CHECK-NEXT:    jmp _use_foo # TAILCALL87;88; CHECK-O0-LABEL: test_zero_ext:89; CHECK-O0:       # %bb.0: # %entry90; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx91; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax92; CHECK-O0-NEXT:    movl %ecx, 8(%eax)93; CHECK-O0-NEXT:    movl $0, 12(%eax)94; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL95entry:96  %0 = addrspacecast ptr addrspace(271) %i to ptr addrspace(272)97  %p64 = getelementptr inbounds %struct.Foo, ptr %f, i32 0, i32 198  store ptr addrspace(272) %0, ptr %p64, align 899  tail call void @use_foo(ptr %f)100  ret void101}102 103define dso_local void @test_trunc(ptr %f, ptr addrspace(272) %i) {104; CHECK-LABEL: test_trunc:105; CHECK:       # %bb.0: # %entry106; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax107; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx108; CHECK-NEXT:    movl %eax, (%ecx)109; CHECK-NEXT:    jmp _use_foo # TAILCALL110;111; CHECK-O0-LABEL: test_trunc:112; CHECK-O0:       # %bb.0: # %entry113; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax114; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx115; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax116; CHECK-O0-NEXT:    movl %ecx, (%eax)117; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL118entry:119  %0 = addrspacecast ptr addrspace(272) %i to ptr120  store ptr %0, ptr %f, align 8121  tail call void @use_foo(ptr %f)122  ret void123}124 125define dso_local void @test_noop1(ptr %f, ptr %i) {126; CHECK-LABEL: test_noop1:127; CHECK:       # %bb.0: # %entry128; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax129; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx130; CHECK-NEXT:    movl %eax, (%ecx)131; CHECK-NEXT:    jmp _use_foo # TAILCALL132;133; CHECK-O0-LABEL: test_noop1:134; CHECK-O0:       # %bb.0: # %entry135; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx136; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax137; CHECK-O0-NEXT:    movl %ecx, (%eax)138; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL139entry:140  store ptr %i, ptr %f, align 8141  tail call void @use_foo(ptr %f)142  ret void143}144 145define dso_local void @test_noop2(ptr %f, ptr addrspace(272) %i) {146; CHECK-LABEL: test_noop2:147; CHECK:       # %bb.0: # %entry148; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax149; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx150; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %edx151; CHECK-NEXT:    movl %ecx, 12(%edx)152; CHECK-NEXT:    movl %eax, 8(%edx)153; CHECK-NEXT:    jmp _use_foo # TAILCALL154;155; CHECK-O0-LABEL: test_noop2:156; CHECK-O0:       # %bb.0: # %entry157; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx158; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %edx159; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax160; CHECK-O0-NEXT:    movl %edx, 8(%eax)161; CHECK-O0-NEXT:    movl %ecx, 12(%eax)162; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL163entry:164  %p64 = getelementptr inbounds %struct.Foo, ptr %f, i32 0, i32 1165  store ptr addrspace(272) %i, ptr %p64, align 8166  tail call void @use_foo(ptr %f)167  ret void168}169 170; Test that null can be passed as a 64-bit pointer.171define dso_local void @test_null_arg(ptr %f) {172; CHECK-LABEL: test_null_arg:173; CHECK:       # %bb.0: # %entry174; CHECK-NEXT:    pushl $0175; CHECK-NEXT:    pushl $0176; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)177; CHECK-NEXT:    calll _test_noop2178; CHECK-NEXT:    addl $12, %esp179; CHECK-NEXT:    retl180;181; CHECK-O0-LABEL: test_null_arg:182; CHECK-O0:       # %bb.0: # %entry183; CHECK-O0-NEXT:    subl $12, %esp184; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx185; CHECK-O0-NEXT:    movl %esp, %eax186; CHECK-O0-NEXT:    movl %ecx, (%eax)187; CHECK-O0-NEXT:    movl $0, 8(%eax)188; CHECK-O0-NEXT:    movl $0, 4(%eax)189; CHECK-O0-NEXT:    calll _test_noop2190; CHECK-O0-NEXT:    addl $12, %esp191; CHECK-O0-NEXT:    retl192entry:193  call void @test_noop2(ptr %f, ptr addrspace(272) null)194  ret void195}196 197define dso_local void @test_unrecognized(ptr %f, ptr addrspace(14) %i) {198; CHECK-LABEL: test_unrecognized:199; CHECK:       # %bb.0: # %entry200; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax201; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx202; CHECK-NEXT:    movl %ecx, 8(%eax)203; CHECK-NEXT:    sarl $31, %ecx204; CHECK-NEXT:    movl %ecx, 12(%eax)205; CHECK-NEXT:    jmp _use_foo # TAILCALL206;207; CHECK-O0-LABEL: test_unrecognized:208; CHECK-O0:       # %bb.0: # %entry209; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %edx210; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax211; CHECK-O0-NEXT:    movl %edx, %ecx212; CHECK-O0-NEXT:    sarl $31, %ecx213; CHECK-O0-NEXT:    movl %edx, 8(%eax)214; CHECK-O0-NEXT:    movl %ecx, 12(%eax)215; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL216entry:217  %0 = addrspacecast ptr addrspace(14) %i to ptr addrspace(272)218  %p64 = getelementptr inbounds %struct.Foo, ptr %f, i32 0, i32 1219  store ptr addrspace(272) %0, ptr %p64, align 8220  tail call void @use_foo(ptr %f)221  ret void222}223 224define dso_local void @test_unrecognized2(ptr %f, ptr addrspace(272) %i) {225; CHECK-LABEL: test_unrecognized2:226; CHECK:       # %bb.0: # %entry227; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax228; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx229; CHECK-NEXT:    movl %eax, 16(%ecx)230; CHECK-NEXT:    jmp _use_foo # TAILCALL231;232; CHECK-O0-LABEL: test_unrecognized2:233; CHECK-O0:       # %bb.0: # %entry234; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax235; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx236; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax237; CHECK-O0-NEXT:    movl %ecx, 16(%eax)238; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL239entry:240  %0 = addrspacecast ptr addrspace(272) %i to ptr addrspace(9)241  %p_other = getelementptr inbounds %struct.Foo, ptr %f, i32 0, i32 2242  store ptr addrspace(9) %0, ptr %p_other, align 8243  tail call void @use_foo(ptr %f)244  ret void245}246 247define i32 @test_load_sptr32(ptr addrspace(270) %i) {248; ALL-LABEL: test_load_sptr32:249; ALL:       # %bb.0: # %entry250; ALL-NEXT:    movl {{[0-9]+}}(%esp), %eax251; ALL-NEXT:    movl (%eax), %eax252; ALL-NEXT:    retl253entry:254  %0 = load i32, ptr addrspace(270) %i, align 4255  ret i32 %0256}257 258define i32 @test_load_uptr32(ptr addrspace(271) %i) {259; ALL-LABEL: test_load_uptr32:260; ALL:       # %bb.0: # %entry261; ALL-NEXT:    movl {{[0-9]+}}(%esp), %eax262; ALL-NEXT:    movl (%eax), %eax263; ALL-NEXT:    retl264entry:265  %0 = load i32, ptr addrspace(271) %i, align 4266  ret i32 %0267}268 269define i32 @test_load_ptr64(ptr addrspace(272) %i) {270; CHECK-LABEL: test_load_ptr64:271; CHECK:       # %bb.0: # %entry272; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax273; CHECK-NEXT:    movl (%eax), %eax274; CHECK-NEXT:    retl275;276; CHECK-O0-LABEL: test_load_ptr64:277; CHECK-O0:       # %bb.0: # %entry278; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax279; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax280; CHECK-O0-NEXT:    movl (%eax), %eax281; CHECK-O0-NEXT:    retl282entry:283  %0 = load i32, ptr addrspace(272) %i, align 8284  ret i32 %0285}286 287define void @test_store_sptr32(ptr addrspace(270) %s, i32 %i) {288; CHECK-LABEL: test_store_sptr32:289; CHECK:       # %bb.0: # %entry290; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax291; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx292; CHECK-NEXT:    movl %eax, (%ecx)293; CHECK-NEXT:    retl294;295; CHECK-O0-LABEL: test_store_sptr32:296; CHECK-O0:       # %bb.0: # %entry297; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx298; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax299; CHECK-O0-NEXT:    movl %ecx, (%eax)300; CHECK-O0-NEXT:    retl301entry:302  store i32 %i, ptr addrspace(270) %s, align 4303  ret void304}305 306define void @test_store_uptr32(ptr addrspace(271) %s, i32 %i) {307; CHECK-LABEL: test_store_uptr32:308; CHECK:       # %bb.0: # %entry309; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax310; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx311; CHECK-NEXT:    movl %eax, (%ecx)312; CHECK-NEXT:    retl313;314; CHECK-O0-LABEL: test_store_uptr32:315; CHECK-O0:       # %bb.0: # %entry316; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx317; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax318; CHECK-O0-NEXT:    movl %ecx, (%eax)319; CHECK-O0-NEXT:    retl320entry:321  store i32 %i, ptr addrspace(271) %s, align 4322  ret void323}324 325define void @test_store_ptr64(ptr addrspace(272) %s, i32 %i) {326; CHECK-LABEL: test_store_ptr64:327; CHECK:       # %bb.0: # %entry328; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax329; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx330; CHECK-NEXT:    movl %eax, (%ecx)331; CHECK-NEXT:    retl332;333; CHECK-O0-LABEL: test_store_ptr64:334; CHECK-O0:       # %bb.0: # %entry335; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax336; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax337; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx338; CHECK-O0-NEXT:    movl %ecx, (%eax)339; CHECK-O0-NEXT:    retl340entry:341  store i32 %i, ptr addrspace(272) %s, align 8342  ret void343}344 345define i64 @test_load_sptr32_zext_i64(ptr addrspace(270) %i) {346; ALL-LABEL: test_load_sptr32_zext_i64:347; ALL:       # %bb.0: # %entry348; ALL-NEXT:    movl {{[0-9]+}}(%esp), %eax349; ALL-NEXT:    movl (%eax), %eax350; ALL-NEXT:    xorl %edx, %edx351; ALL-NEXT:    retl352entry:353  %0 = load i32, ptr addrspace(270) %i, align 4354  %1 = zext i32 %0 to i64355  ret i64 %1356}357 358define void @test_store_sptr32_trunc_i1(ptr addrspace(270) %s, i32 %i) {359; CHECK-LABEL: test_store_sptr32_trunc_i1:360; CHECK:       # %bb.0: # %entry361; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax362; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx363; CHECK-NEXT:    andl $1, %ecx364; CHECK-NEXT:    movb %cl, (%eax)365; CHECK-NEXT:    retl366;367; CHECK-O0-LABEL: test_store_sptr32_trunc_i1:368; CHECK-O0:       # %bb.0: # %entry369; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx370; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax371; CHECK-O0-NEXT:    andl $1, %ecx372; CHECK-O0-NEXT:    # kill: def $cl killed $cl killed $ecx373; CHECK-O0-NEXT:    movb %cl, (%eax)374; CHECK-O0-NEXT:    retl375entry:376  %0 = trunc i32 %i to i1377  store i1 %0, ptr addrspace(270) %s378  ret void379}380