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