brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.1 KiB · 36529be Raw
444 lines · plain
1; RUN: llc -mtriple=aarch64-linux-gnu -O0 -stop-after=irtranslator -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s2 3; CHECK-LABEL: name: test_trivial_call4; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp5; CHECK: BL @trivial_callee, csr_aarch64_aapcs, implicit-def $lr6; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp7declare void @trivial_callee()8define void @test_trivial_call() {9  call void @trivial_callee()10  ret void11}12 13; CHECK-LABEL: name: test_simple_return14; CHECK: BL @simple_return_callee, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit-def $x015; CHECK: [[RES:%[0-9]+]]:_(s64) = COPY $x016; CHECK: $x0 = COPY [[RES]]17; CHECK: RET_ReallyLR implicit $x018declare i64 @simple_return_callee()19define i64 @test_simple_return() {20  %res = call i64 @simple_return_callee()21  ret i64 %res22}23 24; CHECK-LABEL: name: test_simple_arg25; CHECK: [[IN:%[0-9]+]]:_(s32) = COPY $w026; CHECK: $w0 = COPY [[IN]]27; CHECK: BL @simple_arg_callee, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w028; CHECK: RET_ReallyLR29declare void @simple_arg_callee(i32 %in)30define void @test_simple_arg(i32 %in) {31  call void @simple_arg_callee(i32 %in)32  ret void33}34 35; CHECK-LABEL: name: test_indirect_call36; CHECK: registers:37; Make sure the register feeding the indirect call is properly constrained.38; CHECK: - { id: [[FUNC:[0-9]+]], class: gpr64, preferred-register: '', flags: [  ] }39; CHECK: %[[FUNC]]:gpr64(p0) = COPY $x040; CHECK: BLR %[[FUNC]](p0), csr_aarch64_aapcs, implicit-def $lr, implicit $sp41; CHECK: RET_ReallyLR42define void @test_indirect_call(ptr %func) {43  call void %func()44  ret void45}46 47; CHECK-LABEL: name: test_multiple_args48; CHECK: [[IN:%[0-9]+]]:_(s64) = COPY $x049; CHECK: [[ANSWER:%[0-9]+]]:_(s32) = G_CONSTANT i32 4250; CHECK: $w0 = COPY [[ANSWER]]51; CHECK: $x1 = COPY [[IN]]52; CHECK: BL @multiple_args_callee, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0, implicit $x153; CHECK: RET_ReallyLR54declare void @multiple_args_callee(i32, i64)55define void @test_multiple_args(i64 %in) {56  call void @multiple_args_callee(i32 42, i64 %in)57  ret void58}59 60 61; CHECK-LABEL: name: test_struct_formal62; CHECK: [[DBL:%[0-9]+]]:_(s64) = COPY $d063; CHECK: [[I64:%[0-9]+]]:_(s64) = COPY $x064; CHECK: [[I8_C:%[0-9]+]]:_(s32) = COPY $w165; CHECK: [[I8:%[0-9]+]]:_(s8) = G_TRUNC [[I8_C]]66; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x267 68; CHECK: G_STORE [[DBL]](s64), [[ADDR]](p0) :: (store (s64) into %ir.addr)69; CHECK: [[CST1:%[0-9]+]]:_(s64) = G_CONSTANT i64 870; CHECK: [[GEP1:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR]], [[CST1]](s64)71; CHECK: G_STORE [[I64]](s64), [[GEP1]](p0) :: (store (s64) into %ir.addr + 8)72; CHECK: [[CST2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1673; CHECK: [[GEP2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR]], [[CST2]](s64)74; CHECK: G_STORE [[I8]](s8), [[GEP2]](p0) :: (store (s8) into %ir.addr + 16, align 8)75; CHECK: RET_ReallyLR76define void @test_struct_formal({double, i64, i8} %in, ptr %addr) {77  store {double, i64, i8} %in, ptr %addr78  ret void79}80 81 82; CHECK-LABEL: name: test_struct_return83; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x084 85; CHECK: [[LD1:%[0-9]+]]:_(s64) = G_LOAD [[ADDR]](p0) :: (load (s64) from %ir.addr)86; CHECK: [[CST1:%[0-9]+]]:_(s64) = G_CONSTANT i64 887; CHECK: [[GEP1:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR]], [[CST1]](s64)88; CHECK: [[LD2:%[0-9]+]]:_(s64) = G_LOAD [[GEP1]](p0) :: (load (s64) from %ir.addr + 8)89; CHECK: [[CST2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1690; CHECK: [[GEP2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR]], [[CST2]](s64)91; CHECK: [[LD3:%[0-9]+]]:_(s32) = G_LOAD [[GEP2]](p0) :: (load (s32) from %ir.addr + 16, align 8)92 93; CHECK: $d0 = COPY [[LD1]](s64)94; CHECK: $x0 = COPY [[LD2]](s64)95; CHECK: $w1 = COPY [[LD3]](s32)96; CHECK: RET_ReallyLR implicit $d0, implicit $x0, implicit $w197define {double, i64, i32} @test_struct_return(ptr %addr) {98  %val = load {double, i64, i32}, ptr %addr99  ret {double, i64, i32} %val100}101 102; CHECK-LABEL: name: test_arr_call103; CHECK: %0:_(p0) = COPY $x0104; CHECK: [[LD1:%[0-9]+]]:_(s64) = G_LOAD %0(p0) :: (load (s64) from %ir.addr)105; CHECK: [[CST1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8106; CHECK: [[GEP1:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD %0, [[CST1]](s64)107; CHECK: [[LD2:%[0-9]+]]:_(s64) = G_LOAD [[GEP1]](p0) :: (load (s64) from %ir.addr + 8)108; CHECK: [[CST2:%[0-9]+]]:_(s64) = G_CONSTANT i64 16109; CHECK: [[GEP2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD %0, [[CST2]](s64)110; CHECK: [[LD3:%[0-9]+]]:_(s64) = G_LOAD [[GEP2]](p0) :: (load (s64) from %ir.addr + 16)111; CHECK: [[CST3:%[0-9]+]]:_(s64) = G_CONSTANT i64 24112; CHECK: [[GEP3:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD %0, [[CST3]](s64)113; CHECK: [[LD4:%[0-9]+]]:_(s64) = G_LOAD [[GEP3]](p0) :: (load (s64) from %ir.addr + 24)114 115; CHECK: $x0 = COPY [[LD1]](s64)116; CHECK: $x1 = COPY [[LD2]](s64)117; CHECK: $x2 = COPY [[LD3]](s64)118; CHECK: $x3 = COPY [[LD4]](s64)119; CHECK: BL @arr_callee, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2, implicit $x3, implicit-def $x0, implicit-def $x1, implicit-def $x2, implicit-def $x3120; CHECK: [[E0:%[0-9]+]]:_(s64) = COPY $x0121; CHECK: [[E1:%[0-9]+]]:_(s64) = COPY $x1122; CHECK: [[E2:%[0-9]+]]:_(s64) = COPY $x2123; CHECK: [[E3:%[0-9]+]]:_(s64) = COPY $x3124; CHECK: $x0 = COPY [[E1]]125declare [4 x i64] @arr_callee([4 x i64])126define i64 @test_arr_call(ptr %addr) {127  %arg = load [4 x i64], ptr %addr128  %res = call [4 x i64] @arr_callee([4 x i64] %arg)129  %val = extractvalue [4 x i64] %res, 1130  ret i64 %val131}132 133 134; CHECK-LABEL: name: test_abi_exts_call135; CHECK: [[VAL:%[0-9]+]]:_(s8) = G_LOAD136; CHECK: [[VAL_TMP:%[0-9]+]]:_(s32) = G_ANYEXT [[VAL]]137; CHECK: $w0 = COPY [[VAL_TMP]]138; CHECK: BL @take_char, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0139; CHECK: [[SVAL:%[0-9]+]]:_(s32) = G_SEXT [[VAL]](s8)140; CHECK: $w0 = COPY [[SVAL]](s32)141; CHECK: BL @take_char, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0142; CHECK: [[ZVAL:%[0-9]+]]:_(s32) = G_ZEXT [[VAL]](s8)143; CHECK: $w0 = COPY [[ZVAL]](s32)144; CHECK: BL @take_char, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0145declare void @take_char(i8)146define void @test_abi_exts_call(ptr %addr) {147  %val = load i8, ptr %addr148  call void @take_char(i8 %val)149  call void @take_char(i8 signext %val)150  call void @take_char(i8 zeroext %val)151  ret void152}153 154; CHECK-LABEL: name: test_zext_in_callee155; CHECK: bb.1 (%ir-block.0):156; CHECK:   liveins: $x0157; CHECK:   [[COPY:%[0-9]+]]:_(p0) = COPY $x0158; CHECK:   [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[COPY]](p0) :: (load (s8) from %ir.addr)159; CHECK:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp160; CHECK:   [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[LOAD]](s8)161; CHECK:   $w0 = COPY [[ZEXT]](s32)162; CHECK:   BL @has_zext_param, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0163; CHECK:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp164; CHECK:   RET_ReallyLR165declare void @has_zext_param(i8 zeroext)166define void @test_zext_in_callee(ptr %addr) {167  %val = load i8, ptr %addr168  call void @has_zext_param(i8 %val)169  ret void170}171 172; CHECK-LABEL: name: test_sext_in_callee173; CHECK: bb.1 (%ir-block.0):174; CHECK:   liveins: $x0175; CHECK:   [[COPY:%[0-9]+]]:_(p0) = COPY $x0176; CHECK:   [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[COPY]](p0) :: (load (s8) from %ir.addr)177; CHECK:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp178; CHECK:   [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[LOAD]](s8)179; CHECK:   $w0 = COPY [[SEXT]](s32)180; CHECK:   BL @has_sext_param, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0181; CHECK:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp182; CHECK:   RET_ReallyLR183declare void @has_sext_param(i8 signext)184define void @test_sext_in_callee(ptr %addr) {185  %val = load i8, ptr %addr186  call void @has_sext_param(i8 %val)187  ret void188}189 190; CHECK-LABEL: name: test_abi_sext_ret191; CHECK: [[VAL:%[0-9]+]]:_(s8) = G_LOAD192; CHECK: [[SVAL:%[0-9]+]]:_(s32) = G_SEXT [[VAL]](s8)193; CHECK: $w0 = COPY [[SVAL]](s32)194; CHECK: RET_ReallyLR implicit $w0195define signext i8 @test_abi_sext_ret(ptr %addr) {196  %val = load i8, ptr %addr197  ret i8 %val198}199 200; CHECK-LABEL: name: test_abi_zext_ret201; CHECK: [[VAL:%[0-9]+]]:_(s8) = G_LOAD202; CHECK: [[SVAL:%[0-9]+]]:_(s32) = G_ZEXT [[VAL]](s8)203; CHECK: $w0 = COPY [[SVAL]](s32)204; CHECK: RET_ReallyLR implicit $w0205define zeroext i8 @test_abi_zext_ret(ptr %addr) {206  %val = load i8, ptr %addr207  ret i8 %val208}209 210; CHECK-LABEL: name: test_stack_slots211; CHECK: fixedStack:212; CHECK-DAG:  - { id: [[STACK0:[0-9]+]], type: default, offset: 0, size: 8,213; CHECK-DAG:  - { id: [[STACK8:[0-9]+]], type: default, offset: 8, size: 8,214; CHECK-DAG:  - { id: [[STACK16:[0-9]+]], type: default, offset: 16, size: 8,215; CHECK: [[LHS_ADDR:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[STACK0]]216; CHECK: [[LHS:%[0-9]+]]:_(s64) = G_LOAD [[LHS_ADDR]](p0) :: (invariant load (s64) from %fixed-stack.[[STACK0]], align 16)217; CHECK: [[RHS_ADDR:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[STACK8]]218; CHECK: [[RHS:%[0-9]+]]:_(s64) = G_LOAD [[RHS_ADDR]](p0) :: (invariant load (s64) from %fixed-stack.[[STACK8]])219; CHECK: [[ADDR_ADDR:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[STACK16]]220; CHECK: [[ADDR:%[0-9]+]]:_(p0) = G_LOAD [[ADDR_ADDR]](p0) :: (invariant load (p0) from %fixed-stack.[[STACK16]], align 16)221; CHECK: [[SUM:%[0-9]+]]:_(s64) = G_ADD [[LHS]], [[RHS]]222; CHECK: G_STORE [[SUM]](s64), [[ADDR]](p0)223define void @test_stack_slots([8 x i64], i64 %lhs, i64 %rhs, ptr %addr) {224  %sum = add i64 %lhs, %rhs225  store i64 %sum, ptr %addr226  ret void227}228 229; CHECK-LABEL: name: test_call_stack230; CHECK: [[C42:%[0-9]+]]:_(s64) = G_CONSTANT i64 42231; CHECK: [[C12:%[0-9]+]]:_(s64) = G_CONSTANT i64 12232; CHECK: [[PTR:%[0-9]+]]:_(p0) = G_CONSTANT i64 0233; CHECK: ADJCALLSTACKDOWN 24, 0, implicit-def $sp, implicit $sp234; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp235; CHECK: [[C42_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 0236; CHECK: [[C42_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C42_OFFS]](s64)237; CHECK: G_STORE [[C42]](s64), [[C42_LOC]](p0) :: (store (s64) into stack, align 1)238; CHECK: [[C12_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 8239; CHECK: [[C12_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[C12_OFFS]](s64)240; CHECK: G_STORE [[C12]](s64), [[C12_LOC]](p0) :: (store (s64) into stack + 8, align 1)241; CHECK: [[PTR_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 16242; CHECK: [[PTR_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[PTR_OFFS]](s64)243; CHECK: G_STORE [[PTR]](p0), [[PTR_LOC]](p0) :: (store (p0) into stack + 16, align 1)244; CHECK: BL @test_stack_slots245; CHECK: ADJCALLSTACKUP 24, 0, implicit-def $sp, implicit $sp246define void @test_call_stack() {247  call void @test_stack_slots([8 x i64] undef, i64 42, i64 12, ptr null)248  ret void249}250 251; CHECK-LABEL: name: test_mem_i1252; CHECK: fixedStack:253; CHECK-NEXT: - { id: [[SLOT:[0-9]+]], type: default, offset: 0, size: 1, alignment: 16, stack-id: default,254; CHECK-NEXT: isImmutable: true,255; CHECK: [[ADDR:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[SLOT]]256; CHECK: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[ADDR]](p0) :: (invariant load (s8) from %fixed-stack.[[SLOT]], align 16)257; CHECK: [[TRUNC8:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD]]258; CHECK: [[TRUNCASSERT:%[0-9]+]]:_(s8) = G_ASSERT_ZEXT [[TRUNC8]], 1259; CHECK: {{%[0-9]+}}:_(s1) = G_TRUNC [[TRUNCASSERT]]260 261define void @test_mem_i1([8 x i64], i1 %in) {262  ret void263}264 265; CHECK-LABEL: name: test_128bit_struct266; CHECK: $x0 = COPY267; CHECK: $x1 = COPY268; CHECK: $x2 = COPY269; CHECK: BL @take_128bit_struct270define void @test_128bit_struct(ptr %ptr) {271  %struct = load [2 x i64], ptr %ptr272  call void @take_128bit_struct(ptr null, [2 x i64] %struct)273  ret void274}275 276; CHECK-LABEL: name: take_128bit_struct277; CHECK: {{%.*}}:_(p0) = COPY $x0278; CHECK: {{%.*}}:_(s64) = COPY $x1279; CHECK: {{%.*}}:_(s64) = COPY $x2280define void @take_128bit_struct(ptr %ptr, [2 x i64] %in) {281  store [2 x i64] %in, ptr %ptr282  ret void283}284 285; CHECK-LABEL: name: test_split_struct286; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0287; CHECK: [[LO:%[0-9]+]]:_(s64) = G_LOAD %0(p0) :: (load (s64) from %ir.ptr)288; CHECK: [[CST:%[0-9]+]]:_(s64) = G_CONSTANT i64 8289; CHECK: [[GEP:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[ADDR]], [[CST]](s64)290; CHECK: [[HI:%[0-9]+]]:_(s64) = G_LOAD [[GEP]](p0) :: (load (s64) from %ir.ptr + 8)291 292; CHECK: [[SP:%[0-9]+]]:_(p0) = COPY $sp293; CHECK: [[CST2:%[0-9]+]]:_(s64) = G_CONSTANT i64 0294; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST2]](s64)295; CHECK: G_STORE [[LO]](s64), [[GEP2]](p0) :: (store (s64) into stack, align 1)296; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[CST]](s64)297; CHECK: G_STORE [[HI]](s64), [[GEP3]](p0) :: (store (s64) into stack + 8, align 1)298define void @test_split_struct(ptr %ptr) {299  %struct = load [2 x i64], ptr %ptr300  call void @take_split_struct(ptr null, i64 1, i64 2, i64 3,301                               i64 4, i64 5, i64 6,302                               [2 x i64] %struct)303  ret void304}305 306; CHECK-LABEL: name: take_split_struct307; CHECK: fixedStack:308; CHECK-DAG:   - { id: [[LO_FRAME:[0-9]+]], type: default, offset: 0, size: 8309; CHECK-DAG:   - { id: [[HI_FRAME:[0-9]+]], type: default, offset: 8, size: 8310 311; CHECK: [[LOPTR:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[LO_FRAME]]312; CHECK: [[LO:%[0-9]+]]:_(s64) = G_LOAD [[LOPTR]](p0) :: (invariant load (s64) from %fixed-stack.[[LO_FRAME]], align 16)313 314; CHECK: [[HIPTR:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[HI_FRAME]]315; CHECK: [[HI:%[0-9]+]]:_(s64) = G_LOAD [[HIPTR]](p0) :: (invariant load (s64) from %fixed-stack.[[HI_FRAME]])316define void @take_split_struct(ptr %ptr, i64, i64, i64,317                               i64, i64, i64,318                               [2 x i64] %in) {319  store [2 x i64] %in, ptr %ptr320  ret void321}322 323%size0type = type { }324declare %size0type @func.returns.size0.struct()325 326; CHECK-LABEL: name: call_returns_size0_struct327; CHECK: bb.1328; CHECK-NEXT: ADJCALLSTACKDOWN329; CHECK-NEXT: BL330; CHECK-NEXT: ADJCALLSTACKUP331; CHECK-NEXT: RET_ReallyLR332define void @call_returns_size0_struct() {333  ; FIXME: Why is this valid IR?334  %call = call %size0type @func.returns.size0.struct()335  ret void336}337 338declare [0 x i8] @func.returns.size0.array()339 340; CHECK-LABEL: name: call_returns_size0_array341; CHECK: bb.1342; CHECK-NEXT: ADJCALLSTACKDOWN343; CHECK-NEXT: BL344; CHECK-NEXT: ADJCALLSTACKUP345; CHECK-NEXT: RET_ReallyLR346define void @call_returns_size0_array() {347  ; FIXME: Why is this valid IR?348  %call = call [0 x i8] @func.returns.size0.array()349  ret void350}351 352declare [1 x %size0type] @func.returns.array.size0.struct()353; CHECK-LABEL: name: call_returns_array_size0_struct354; CHECK: bb.1355; CHECK-NEXT: ADJCALLSTACKDOWN356; CHECK-NEXT: BL357; CHECK-NEXT: ADJCALLSTACKUP358; CHECK-NEXT: RET_ReallyLR359define void @call_returns_array_size0_struct() {360  ; FIXME: Why is this valid IR?361  %call = call [1 x %size0type] @func.returns.array.size0.struct()362  ret void363}364 365; Test extends on return values.366 367; This should notice that the return value from has_zext_return is zero368; extended.369declare zeroext i16 @has_zext_return()370define i32 @test_zext_return_from_callee() {371  ; CHECK-LABEL: name: test_zext_return_from_callee372  ; CHECK: bb.1 (%ir-block.0):373  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp374  ; CHECK-NEXT:   BL @has_zext_return, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit-def $w0375  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp376  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0377  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16378  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)379  ; CHECK-NEXT:   [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[TRUNC]](s16)380  ; CHECK-NEXT:   $w0 = COPY [[ZEXT]](s32)381  ; CHECK-NEXT:   RET_ReallyLR implicit $w0382  %val = call i16 @has_zext_return()383  %ext = zext i16 %val to i32384  ret i32 %ext385}386 387; Same as above, but with zeroext explicitly on the call. Should produce the388; same codegen.389define i32 @test_zext_return_from_callee2() {390  ; CHECK-LABEL: name: test_zext_return_from_callee2391  ; CHECK: bb.1 (%ir-block.0):392  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp393  ; CHECK-NEXT:   BL @has_zext_return, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit-def $w0394  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp395  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0396  ; CHECK-NEXT:   [[ASSERT_ZEXT:%[0-9]+]]:_(s32) = G_ASSERT_ZEXT [[COPY]], 16397  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_ZEXT]](s32)398  ; CHECK-NEXT:   [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[TRUNC]](s16)399  ; CHECK-NEXT:   $w0 = COPY [[ZEXT]](s32)400  ; CHECK-NEXT:   RET_ReallyLR implicit $w0401  %val = call zeroext i16 @has_zext_return()402  %ext = zext i16 %val to i32403  ret i32 %ext404}405 406; This should notice that the return value from has_sext_return is sign407; extended.408declare signext i16 @has_sext_return()409define i32 @test_sext_return_from_callee() {410  ; CHECK-LABEL: name: test_sext_return_from_callee411  ; CHECK: bb.1 (%ir-block.0):412  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp413  ; CHECK-NEXT:   BL @has_sext_return, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit-def $w0414  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp415  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0416  ; CHECK-NEXT:   [[ASSERT_SEXT:%[0-9]+]]:_(s32) = G_ASSERT_SEXT [[COPY]], 16417  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_SEXT]](s32)418  ; CHECK-NEXT:   [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[TRUNC]](s16)419  ; CHECK-NEXT:   $w0 = COPY [[SEXT]](s32)420  ; CHECK-NEXT:   RET_ReallyLR implicit $w0421  %val = call i16 @has_sext_return()422  %ext = sext i16 %val to i32423  ret i32 %ext424}425 426; Same as above, but with signext explicitly on the call. Should produce the427; same codegen.428define i32 @test_sext_return_from_callee2() {429  ; CHECK-LABEL: name: test_sext_return_from_callee2430  ; CHECK: bb.1 (%ir-block.0):431  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp432  ; CHECK-NEXT:   BL @has_sext_return, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit-def $w0433  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp434  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0435  ; CHECK-NEXT:   [[ASSERT_SEXT:%[0-9]+]]:_(s32) = G_ASSERT_SEXT [[COPY]], 16436  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[ASSERT_SEXT]](s32)437  ; CHECK-NEXT:   [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[TRUNC]](s16)438  ; CHECK-NEXT:   $w0 = COPY [[SEXT]](s32)439  ; CHECK-NEXT:   RET_ReallyLR implicit $w0440  %val = call signext i16 @has_sext_return()441  %ext = sext i16 %val to i32442  ret i32 %ext443}444