824 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2; RUN: llc -O0 -mtriple=i386-linux-gnu -mattr=+sse2 -global-isel -stop-after=irtranslator < %s | FileCheck %s --check-prefix=X863; RUN: llc -O0 -mtriple=x86_64-linux-gnu -global-isel -stop-after=irtranslator < %s | FileCheck %s --check-prefix=X644 5@a1_8bit = external global i86@a7_8bit = external global i87@a8_8bit = external global i88%struct.all = type { i8, i16, i32, i8, i16, i32, i64, float, double }9 10define i8 @test_i8_args_8(i8 %arg1, i8 %arg2, i8 %arg3, i8 %arg4, i8 %arg5, i8 %arg6, i8 %arg7, i8 %arg8) {11 ; X86-LABEL: name: test_i8_args_812 ; X86: bb.1.entry:13 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.714 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s8) from %fixed-stack.7, align 16)15 ; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD]](s32)16 ; X86-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.617 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s8) from %fixed-stack.6, align 4)18 ; X86-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD1]](s32)19 ; X86-NEXT: [[FRAME_INDEX2:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.520 ; X86-NEXT: [[LOAD2:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX2]](p0) :: (invariant load (s8) from %fixed-stack.5, align 8)21 ; X86-NEXT: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD2]](s32)22 ; X86-NEXT: [[FRAME_INDEX3:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.423 ; X86-NEXT: [[LOAD3:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX3]](p0) :: (invariant load (s8) from %fixed-stack.4, align 4)24 ; X86-NEXT: [[TRUNC3:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD3]](s32)25 ; X86-NEXT: [[FRAME_INDEX4:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.326 ; X86-NEXT: [[LOAD4:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX4]](p0) :: (invariant load (s8) from %fixed-stack.3, align 16)27 ; X86-NEXT: [[TRUNC4:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD4]](s32)28 ; X86-NEXT: [[FRAME_INDEX5:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.229 ; X86-NEXT: [[LOAD5:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX5]](p0) :: (invariant load (s8) from %fixed-stack.2, align 4)30 ; X86-NEXT: [[TRUNC5:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD5]](s32)31 ; X86-NEXT: [[FRAME_INDEX6:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.132 ; X86-NEXT: [[LOAD6:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX6]](p0) :: (invariant load (s8) from %fixed-stack.1, align 8)33 ; X86-NEXT: [[TRUNC6:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD6]](s32)34 ; X86-NEXT: [[FRAME_INDEX7:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.035 ; X86-NEXT: [[LOAD7:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX7]](p0) :: (invariant load (s8) from %fixed-stack.0, align 4)36 ; X86-NEXT: [[TRUNC7:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD7]](s32)37 ; X86-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a1_8bit38 ; X86-NEXT: [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a7_8bit39 ; X86-NEXT: [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a8_8bit40 ; X86-NEXT: G_STORE [[TRUNC]](s8), [[GV]](p0) :: (store (s8) into @a1_8bit)41 ; X86-NEXT: G_STORE [[TRUNC6]](s8), [[GV1]](p0) :: (store (s8) into @a7_8bit)42 ; X86-NEXT: G_STORE [[TRUNC7]](s8), [[GV2]](p0) :: (store (s8) into @a8_8bit)43 ; X86-NEXT: $al = COPY [[TRUNC]](s8)44 ; X86-NEXT: RET 0, implicit $al45 ;46 ; X64-LABEL: name: test_i8_args_847 ; X64: bb.1.entry:48 ; X64-NEXT: liveins: $ecx, $edi, $edx, $esi, $r8d, $r9d49 ; X64-NEXT: {{ $}}50 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi51 ; X64-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)52 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $esi53 ; X64-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s32)54 ; X64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $edx55 ; X64-NEXT: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[COPY2]](s32)56 ; X64-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $ecx57 ; X64-NEXT: [[TRUNC3:%[0-9]+]]:_(s8) = G_TRUNC [[COPY3]](s32)58 ; X64-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY $r8d59 ; X64-NEXT: [[TRUNC4:%[0-9]+]]:_(s8) = G_TRUNC [[COPY4]](s32)60 ; X64-NEXT: [[COPY5:%[0-9]+]]:_(s32) = COPY $r9d61 ; X64-NEXT: [[TRUNC5:%[0-9]+]]:_(s8) = G_TRUNC [[COPY5]](s32)62 ; X64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.163 ; X64-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s8) from %fixed-stack.1, align 16)64 ; X64-NEXT: [[TRUNC6:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD]](s32)65 ; X64-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.066 ; X64-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s8) from %fixed-stack.0, align 8)67 ; X64-NEXT: [[TRUNC7:%[0-9]+]]:_(s8) = G_TRUNC [[LOAD1]](s32)68 ; X64-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a1_8bit69 ; X64-NEXT: [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a7_8bit70 ; X64-NEXT: [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a8_8bit71 ; X64-NEXT: G_STORE [[TRUNC]](s8), [[GV]](p0) :: (store (s8) into @a1_8bit)72 ; X64-NEXT: G_STORE [[TRUNC6]](s8), [[GV1]](p0) :: (store (s8) into @a7_8bit)73 ; X64-NEXT: G_STORE [[TRUNC7]](s8), [[GV2]](p0) :: (store (s8) into @a8_8bit)74 ; X64-NEXT: $al = COPY [[TRUNC]](s8)75 ; X64-NEXT: RET 0, implicit $al76entry:77 store i8 %arg1, ptr @a1_8bit78 store i8 %arg7, ptr @a7_8bit79 store i8 %arg8, ptr @a8_8bit80 ret i8 %arg181}82 83@a1_32bit = external global i3284@a7_32bit = external global i3285@a8_32bit = external global i3286 87define i32 @test_i32_args_8(i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %arg5, i32 %arg6, i32 %arg7, i32 %arg8) {88 ; X86-LABEL: name: test_i32_args_889 ; X86: bb.1.entry:90 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.791 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s32) from %fixed-stack.7, align 16)92 ; X86-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.693 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s32) from %fixed-stack.6)94 ; X86-NEXT: [[FRAME_INDEX2:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.595 ; X86-NEXT: [[LOAD2:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX2]](p0) :: (invariant load (s32) from %fixed-stack.5, align 8)96 ; X86-NEXT: [[FRAME_INDEX3:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.497 ; X86-NEXT: [[LOAD3:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX3]](p0) :: (invariant load (s32) from %fixed-stack.4)98 ; X86-NEXT: [[FRAME_INDEX4:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.399 ; X86-NEXT: [[LOAD4:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX4]](p0) :: (invariant load (s32) from %fixed-stack.3, align 16)100 ; X86-NEXT: [[FRAME_INDEX5:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.2101 ; X86-NEXT: [[LOAD5:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX5]](p0) :: (invariant load (s32) from %fixed-stack.2)102 ; X86-NEXT: [[FRAME_INDEX6:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1103 ; X86-NEXT: [[LOAD6:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX6]](p0) :: (invariant load (s32) from %fixed-stack.1, align 8)104 ; X86-NEXT: [[FRAME_INDEX7:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0105 ; X86-NEXT: [[LOAD7:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX7]](p0) :: (invariant load (s32) from %fixed-stack.0)106 ; X86-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a1_32bit107 ; X86-NEXT: [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a7_32bit108 ; X86-NEXT: [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a8_32bit109 ; X86-NEXT: G_STORE [[LOAD]](s32), [[GV]](p0) :: (store (s32) into @a1_32bit)110 ; X86-NEXT: G_STORE [[LOAD6]](s32), [[GV1]](p0) :: (store (s32) into @a7_32bit)111 ; X86-NEXT: G_STORE [[LOAD7]](s32), [[GV2]](p0) :: (store (s32) into @a8_32bit)112 ; X86-NEXT: $eax = COPY [[LOAD]](s32)113 ; X86-NEXT: RET 0, implicit $eax114 ;115 ; X64-LABEL: name: test_i32_args_8116 ; X64: bb.1.entry:117 ; X64-NEXT: liveins: $ecx, $edi, $edx, $esi, $r8d, $r9d118 ; X64-NEXT: {{ $}}119 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi120 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $esi121 ; X64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $edx122 ; X64-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $ecx123 ; X64-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY $r8d124 ; X64-NEXT: [[COPY5:%[0-9]+]]:_(s32) = COPY $r9d125 ; X64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1126 ; X64-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s32) from %fixed-stack.1, align 16)127 ; X64-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0128 ; X64-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s32) from %fixed-stack.0, align 8)129 ; X64-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a1_32bit130 ; X64-NEXT: [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a7_32bit131 ; X64-NEXT: [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a8_32bit132 ; X64-NEXT: G_STORE [[COPY]](s32), [[GV]](p0) :: (store (s32) into @a1_32bit)133 ; X64-NEXT: G_STORE [[LOAD]](s32), [[GV1]](p0) :: (store (s32) into @a7_32bit)134 ; X64-NEXT: G_STORE [[LOAD1]](s32), [[GV2]](p0) :: (store (s32) into @a8_32bit)135 ; X64-NEXT: $eax = COPY [[COPY]](s32)136 ; X64-NEXT: RET 0, implicit $eax137entry:138 store i32 %arg1, ptr @a1_32bit139 store i32 %arg7, ptr @a7_32bit140 store i32 %arg8, ptr @a8_32bit141 ret i32 %arg1142}143 144@a1_64bit = external global i64145@a7_64bit = external global i64146@a8_64bit = external global i64147 148; ... a bunch more that we don't track ...149define i64 @test_i64_args_8(i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %arg5, i64 %arg6, i64 %arg7, i64 %arg8) {150 ; X86-LABEL: name: test_i64_args_8151 ; X86: bb.1.entry:152 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.15153 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s32) from %fixed-stack.15, align 16)154 ; X86-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.14155 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s32) from %fixed-stack.14)156 ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[LOAD]](s32), [[LOAD1]](s32)157 ; X86-NEXT: [[FRAME_INDEX2:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.13158 ; X86-NEXT: [[LOAD2:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX2]](p0) :: (invariant load (s32) from %fixed-stack.13, align 8)159 ; X86-NEXT: [[FRAME_INDEX3:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.12160 ; X86-NEXT: [[LOAD3:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX3]](p0) :: (invariant load (s32) from %fixed-stack.12)161 ; X86-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[LOAD2]](s32), [[LOAD3]](s32)162 ; X86-NEXT: [[FRAME_INDEX4:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.11163 ; X86-NEXT: [[LOAD4:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX4]](p0) :: (invariant load (s32) from %fixed-stack.11, align 16)164 ; X86-NEXT: [[FRAME_INDEX5:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.10165 ; X86-NEXT: [[LOAD5:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX5]](p0) :: (invariant load (s32) from %fixed-stack.10)166 ; X86-NEXT: [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[LOAD4]](s32), [[LOAD5]](s32)167 ; X86-NEXT: [[FRAME_INDEX6:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.9168 ; X86-NEXT: [[LOAD6:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX6]](p0) :: (invariant load (s32) from %fixed-stack.9, align 8)169 ; X86-NEXT: [[FRAME_INDEX7:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.8170 ; X86-NEXT: [[LOAD7:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX7]](p0) :: (invariant load (s32) from %fixed-stack.8)171 ; X86-NEXT: [[MV3:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[LOAD6]](s32), [[LOAD7]](s32)172 ; X86-NEXT: [[FRAME_INDEX8:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.7173 ; X86-NEXT: [[LOAD8:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX8]](p0) :: (invariant load (s32) from %fixed-stack.7, align 16)174 ; X86-NEXT: [[FRAME_INDEX9:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.6175 ; X86-NEXT: [[LOAD9:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX9]](p0) :: (invariant load (s32) from %fixed-stack.6)176 ; X86-NEXT: [[MV4:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[LOAD8]](s32), [[LOAD9]](s32)177 ; X86-NEXT: [[FRAME_INDEX10:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.5178 ; X86-NEXT: [[LOAD10:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX10]](p0) :: (invariant load (s32) from %fixed-stack.5, align 8)179 ; X86-NEXT: [[FRAME_INDEX11:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.4180 ; X86-NEXT: [[LOAD11:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX11]](p0) :: (invariant load (s32) from %fixed-stack.4)181 ; X86-NEXT: [[MV5:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[LOAD10]](s32), [[LOAD11]](s32)182 ; X86-NEXT: [[FRAME_INDEX12:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.3183 ; X86-NEXT: [[LOAD12:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX12]](p0) :: (invariant load (s32) from %fixed-stack.3, align 16)184 ; X86-NEXT: [[FRAME_INDEX13:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.2185 ; X86-NEXT: [[LOAD13:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX13]](p0) :: (invariant load (s32) from %fixed-stack.2)186 ; X86-NEXT: [[MV6:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[LOAD12]](s32), [[LOAD13]](s32)187 ; X86-NEXT: [[FRAME_INDEX14:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1188 ; X86-NEXT: [[LOAD14:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX14]](p0) :: (invariant load (s32) from %fixed-stack.1, align 8)189 ; X86-NEXT: [[FRAME_INDEX15:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0190 ; X86-NEXT: [[LOAD15:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX15]](p0) :: (invariant load (s32) from %fixed-stack.0)191 ; X86-NEXT: [[MV7:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[LOAD14]](s32), [[LOAD15]](s32)192 ; X86-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a1_64bit193 ; X86-NEXT: [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a7_64bit194 ; X86-NEXT: [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a8_64bit195 ; X86-NEXT: G_STORE [[MV]](s64), [[GV]](p0) :: (store (s64) into @a1_64bit, align 4)196 ; X86-NEXT: G_STORE [[MV6]](s64), [[GV1]](p0) :: (store (s64) into @a7_64bit, align 4)197 ; X86-NEXT: G_STORE [[MV7]](s64), [[GV2]](p0) :: (store (s64) into @a8_64bit, align 4)198 ; X86-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64)199 ; X86-NEXT: $eax = COPY [[UV]](s32)200 ; X86-NEXT: $edx = COPY [[UV1]](s32)201 ; X86-NEXT: RET 0, implicit $eax, implicit $edx202 ;203 ; X64-LABEL: name: test_i64_args_8204 ; X64: bb.1.entry:205 ; X64-NEXT: liveins: $rcx, $rdi, $rdx, $rsi, $r8, $r9206 ; X64-NEXT: {{ $}}207 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $rdi208 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $rsi209 ; X64-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $rdx210 ; X64-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $rcx211 ; X64-NEXT: [[COPY4:%[0-9]+]]:_(s64) = COPY $r8212 ; X64-NEXT: [[COPY5:%[0-9]+]]:_(s64) = COPY $r9213 ; X64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1214 ; X64-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s64) from %fixed-stack.1, align 16)215 ; X64-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0216 ; X64-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s64) from %fixed-stack.0)217 ; X64-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a1_64bit218 ; X64-NEXT: [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a7_64bit219 ; X64-NEXT: [[GV2:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @a8_64bit220 ; X64-NEXT: G_STORE [[COPY]](s64), [[GV]](p0) :: (store (s64) into @a1_64bit)221 ; X64-NEXT: G_STORE [[LOAD]](s64), [[GV1]](p0) :: (store (s64) into @a7_64bit)222 ; X64-NEXT: G_STORE [[LOAD1]](s64), [[GV2]](p0) :: (store (s64) into @a8_64bit)223 ; X64-NEXT: $rax = COPY [[COPY]](s64)224 ; X64-NEXT: RET 0, implicit $rax225entry:226 store i64 %arg1, ptr @a1_64bit227 store i64 %arg7, ptr @a7_64bit228 store i64 %arg8, ptr @a8_64bit229 ret i64 %arg1230}231 232define float @test_float_args(float %arg1, float %arg2) {233 ; X86-LABEL: name: test_float_args234 ; X86: bb.1 (%ir-block.0):235 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1236 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s32) from %fixed-stack.1, align 16)237 ; X86-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0238 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s32) from %fixed-stack.0)239 ; X86-NEXT: $fp0 = COPY [[LOAD1]](s32)240 ; X86-NEXT: RET 0, implicit $fp0241 ;242 ; X64-LABEL: name: test_float_args243 ; X64: bb.1 (%ir-block.0):244 ; X64-NEXT: liveins: $xmm0, $xmm1245 ; X64-NEXT: {{ $}}246 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $xmm0247 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $xmm1248 ; X64-NEXT: $xmm0 = COPY [[COPY1]](s32)249 ; X64-NEXT: RET 0, implicit $xmm0250 ret float %arg2251}252 253define double @test_double_args(double %arg1, double %arg2) {254 ; X86-LABEL: name: test_double_args255 ; X86: bb.1 (%ir-block.0):256 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1257 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s64) from %fixed-stack.1, align 16)258 ; X86-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0259 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s64) from %fixed-stack.0)260 ; X86-NEXT: $fp0 = COPY [[LOAD1]](s64)261 ; X86-NEXT: RET 0, implicit $fp0262 ;263 ; X64-LABEL: name: test_double_args264 ; X64: bb.1 (%ir-block.0):265 ; X64-NEXT: liveins: $xmm0, $xmm1266 ; X64-NEXT: {{ $}}267 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $xmm0268 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $xmm1269 ; X64-NEXT: $xmm0 = COPY [[COPY1]](s64)270 ; X64-NEXT: RET 0, implicit $xmm0271 ret double %arg2272}273 274define <4 x i32> @test_v4i32_args(<4 x i32> %arg1, <4 x i32> %arg2) {275 ; X86-LABEL: name: test_v4i32_args276 ; X86: bb.1 (%ir-block.0):277 ; X86-NEXT: liveins: $xmm0, $xmm1278 ; X86-NEXT: {{ $}}279 ; X86-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $xmm0280 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $xmm1281 ; X86-NEXT: $xmm0 = COPY [[COPY1]](<4 x s32>)282 ; X86-NEXT: RET 0, implicit $xmm0283 ;284 ; X64-LABEL: name: test_v4i32_args285 ; X64: bb.1 (%ir-block.0):286 ; X64-NEXT: liveins: $xmm0, $xmm1287 ; X64-NEXT: {{ $}}288 ; X64-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $xmm0289 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $xmm1290 ; X64-NEXT: $xmm0 = COPY [[COPY1]](<4 x s32>)291 ; X64-NEXT: RET 0, implicit $xmm0292 ret <4 x i32> %arg2293}294 295define <8 x i32> @test_v8i32_args(<8 x i32> %arg1) {296 ; X86-LABEL: name: test_v8i32_args297 ; X86: bb.1 (%ir-block.0):298 ; X86-NEXT: liveins: $xmm0, $xmm1299 ; X86-NEXT: {{ $}}300 ; X86-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $xmm0301 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $xmm1302 ; X86-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>)303 ; X86-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[CONCAT_VECTORS]](<8 x s32>)304 ; X86-NEXT: $xmm0 = COPY [[UV]](<4 x s32>)305 ; X86-NEXT: $xmm1 = COPY [[UV1]](<4 x s32>)306 ; X86-NEXT: RET 0, implicit $xmm0, implicit $xmm1307 ;308 ; X64-LABEL: name: test_v8i32_args309 ; X64: bb.1 (%ir-block.0):310 ; X64-NEXT: liveins: $xmm0, $xmm1311 ; X64-NEXT: {{ $}}312 ; X64-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $xmm0313 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $xmm1314 ; X64-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>)315 ; X64-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[CONCAT_VECTORS]](<8 x s32>)316 ; X64-NEXT: $xmm0 = COPY [[UV]](<4 x s32>)317 ; X64-NEXT: $xmm1 = COPY [[UV1]](<4 x s32>)318 ; X64-NEXT: RET 0, implicit $xmm0, implicit $xmm1319 ret <8 x i32> %arg1320}321 322define void @test_void_return() {323 ; X86-LABEL: name: test_void_return324 ; X86: bb.1.entry:325 ; X86-NEXT: RET 0326 ;327 ; X64-LABEL: name: test_void_return328 ; X64: bb.1.entry:329 ; X64-NEXT: RET 0330entry:331 ret void332}333 334define ptr @test_memop_i32(ptr %p1) {335 ; X86-LABEL: name: test_memop_i32336 ; X86: bb.1 (%ir-block.0):337 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0338 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (p0) from %fixed-stack.0, align 16)339 ; X86-NEXT: $eax = COPY [[LOAD]](p0)340 ; X86-NEXT: RET 0, implicit $eax341 ;342 ; X64-LABEL: name: test_memop_i32343 ; X64: bb.1 (%ir-block.0):344 ; X64-NEXT: liveins: $rdi345 ; X64-NEXT: {{ $}}346 ; X64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi347 ; X64-NEXT: $rax = COPY [[COPY]](p0)348 ; X64-NEXT: RET 0, implicit $rax349 ret ptr %p1;350}351 352declare void @trivial_callee()353define void @test_trivial_call() {354 ; X86-LABEL: name: test_trivial_call355 ; X86: bb.1 (%ir-block.0):356 ; X86-NEXT: ADJCALLSTACKDOWN32 0, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp357 ; X86-NEXT: CALLpcrel32 @trivial_callee, csr_32, implicit $esp, implicit $ssp358 ; X86-NEXT: ADJCALLSTACKUP32 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp359 ; X86-NEXT: RET 0360 ;361 ; X64-LABEL: name: test_trivial_call362 ; X64: bb.1 (%ir-block.0):363 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp364 ; X64-NEXT: CALL64pcrel32 @trivial_callee, csr_64, implicit $rsp, implicit $ssp365 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp366 ; X64-NEXT: RET 0367 call void @trivial_callee()368 ret void369}370 371declare void @simple_arg_callee(i32 %in0, i32 %in1)372define void @test_simple_arg(i32 %in0, i32 %in1) {373 ; X86-LABEL: name: test_simple_arg374 ; X86: bb.1 (%ir-block.0):375 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1376 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s32) from %fixed-stack.1, align 16)377 ; X86-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0378 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (s32) from %fixed-stack.0)379 ; X86-NEXT: ADJCALLSTACKDOWN32 8, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp380 ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $esp381 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0382 ; X86-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)383 ; X86-NEXT: G_STORE [[LOAD1]](s32), [[PTR_ADD]](p0) :: (store (s32) into stack, align 1)384 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $esp385 ; X86-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 4386 ; X86-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s32)387 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD1]](p0) :: (store (s32) into stack + 4, align 1)388 ; X86-NEXT: CALLpcrel32 @simple_arg_callee, csr_32, implicit $esp, implicit $ssp389 ; X86-NEXT: ADJCALLSTACKUP32 8, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp390 ; X86-NEXT: RET 0391 ;392 ; X64-LABEL: name: test_simple_arg393 ; X64: bb.1 (%ir-block.0):394 ; X64-NEXT: liveins: $edi, $esi395 ; X64-NEXT: {{ $}}396 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi397 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $esi398 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp399 ; X64-NEXT: $edi = COPY [[COPY1]](s32)400 ; X64-NEXT: $esi = COPY [[COPY]](s32)401 ; X64-NEXT: CALL64pcrel32 @simple_arg_callee, csr_64, implicit $rsp, implicit $ssp, implicit $edi, implicit $esi402 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp403 ; X64-NEXT: RET 0404 call void @simple_arg_callee(i32 %in1, i32 %in0)405 ret void406}407 408declare void @simple_arg8_callee(i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %arg5, i32 %arg6, i32 %arg7, i32 %arg8)409define void @test_simple_arg8_call(i32 %in0) {410 ; X86-LABEL: name: test_simple_arg8_call411 ; X86: bb.1 (%ir-block.0):412 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0413 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s32) from %fixed-stack.0, align 16)414 ; X86-NEXT: ADJCALLSTACKDOWN32 32, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp415 ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $esp416 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0417 ; X86-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)418 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD]](p0) :: (store (s32) into stack, align 1)419 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $esp420 ; X86-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 4421 ; X86-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s32)422 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD1]](p0) :: (store (s32) into stack + 4, align 1)423 ; X86-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $esp424 ; X86-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 8425 ; X86-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY2]], [[C2]](s32)426 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD2]](p0) :: (store (s32) into stack + 8, align 1)427 ; X86-NEXT: [[COPY3:%[0-9]+]]:_(p0) = COPY $esp428 ; X86-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 12429 ; X86-NEXT: [[PTR_ADD3:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY3]], [[C3]](s32)430 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD3]](p0) :: (store (s32) into stack + 12, align 1)431 ; X86-NEXT: [[COPY4:%[0-9]+]]:_(p0) = COPY $esp432 ; X86-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 16433 ; X86-NEXT: [[PTR_ADD4:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY4]], [[C4]](s32)434 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD4]](p0) :: (store (s32) into stack + 16, align 1)435 ; X86-NEXT: [[COPY5:%[0-9]+]]:_(p0) = COPY $esp436 ; X86-NEXT: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 20437 ; X86-NEXT: [[PTR_ADD5:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY5]], [[C5]](s32)438 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD5]](p0) :: (store (s32) into stack + 20, align 1)439 ; X86-NEXT: [[COPY6:%[0-9]+]]:_(p0) = COPY $esp440 ; X86-NEXT: [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 24441 ; X86-NEXT: [[PTR_ADD6:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY6]], [[C6]](s32)442 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD6]](p0) :: (store (s32) into stack + 24, align 1)443 ; X86-NEXT: [[COPY7:%[0-9]+]]:_(p0) = COPY $esp444 ; X86-NEXT: [[C7:%[0-9]+]]:_(s32) = G_CONSTANT i32 28445 ; X86-NEXT: [[PTR_ADD7:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY7]], [[C7]](s32)446 ; X86-NEXT: G_STORE [[LOAD]](s32), [[PTR_ADD7]](p0) :: (store (s32) into stack + 28, align 1)447 ; X86-NEXT: CALLpcrel32 @simple_arg8_callee, csr_32, implicit $esp, implicit $ssp448 ; X86-NEXT: ADJCALLSTACKUP32 32, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp449 ; X86-NEXT: RET 0450 ;451 ; X64-LABEL: name: test_simple_arg8_call452 ; X64: bb.1 (%ir-block.0):453 ; X64-NEXT: liveins: $edi454 ; X64-NEXT: {{ $}}455 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi456 ; X64-NEXT: ADJCALLSTACKDOWN64 16, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp457 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $rsp458 ; X64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0459 ; X64-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C]](s64)460 ; X64-NEXT: G_STORE [[COPY]](s32), [[PTR_ADD]](p0) :: (store (s32) into stack, align 1)461 ; X64-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $rsp462 ; X64-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8463 ; X64-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY2]], [[C1]](s64)464 ; X64-NEXT: G_STORE [[COPY]](s32), [[PTR_ADD1]](p0) :: (store (s32) into stack + 8, align 1)465 ; X64-NEXT: $edi = COPY [[COPY]](s32)466 ; X64-NEXT: $esi = COPY [[COPY]](s32)467 ; X64-NEXT: $edx = COPY [[COPY]](s32)468 ; X64-NEXT: $ecx = COPY [[COPY]](s32)469 ; X64-NEXT: $r8d = COPY [[COPY]](s32)470 ; X64-NEXT: $r9d = COPY [[COPY]](s32)471 ; X64-NEXT: CALL64pcrel32 @simple_arg8_callee, csr_64, implicit $rsp, implicit $ssp, implicit $edi, implicit $esi, implicit $edx, implicit $ecx, implicit $r8d, implicit $r9d472 ; X64-NEXT: ADJCALLSTACKUP64 16, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp473 ; X64-NEXT: RET 0474 call void @simple_arg8_callee(i32 %in0, i32 %in0, i32 %in0, i32 %in0,i32 %in0, i32 %in0, i32 %in0, i32 %in0)475 ret void476}477 478declare i32 @simple_return_callee(i32 %in0)479define i32 @test_simple_return_callee() {480 ; X86-LABEL: name: test_simple_return_callee481 ; X86: bb.1 (%ir-block.0):482 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 5483 ; X86-NEXT: ADJCALLSTACKDOWN32 4, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp484 ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $esp485 ; X86-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0486 ; X86-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C1]](s32)487 ; X86-NEXT: G_STORE [[C]](s32), [[PTR_ADD]](p0) :: (store (s32) into stack, align 1)488 ; X86-NEXT: CALLpcrel32 @simple_return_callee, csr_32, implicit $esp, implicit $ssp, implicit-def $eax489 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $eax490 ; X86-NEXT: ADJCALLSTACKUP32 4, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp491 ; X86-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY1]], [[COPY1]]492 ; X86-NEXT: $eax = COPY [[ADD]](s32)493 ; X86-NEXT: RET 0, implicit $eax494 ;495 ; X64-LABEL: name: test_simple_return_callee496 ; X64: bb.1 (%ir-block.0):497 ; X64-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 5498 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp499 ; X64-NEXT: $edi = COPY [[C]](s32)500 ; X64-NEXT: CALL64pcrel32 @simple_return_callee, csr_64, implicit $rsp, implicit $ssp, implicit $edi, implicit-def $eax501 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $eax502 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp503 ; X64-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[COPY]]504 ; X64-NEXT: $eax = COPY [[ADD]](s32)505 ; X64-NEXT: RET 0, implicit $eax506 %call = call i32 @simple_return_callee(i32 5)507 %r = add i32 %call, %call508 ret i32 %r509}510 511declare <8 x i32> @split_return_callee(<8 x i32> %in0)512define <8 x i32> @test_split_return_callee(<8 x i32> %arg1, <8 x i32> %arg2) {513 ; X86-LABEL: name: test_split_return_callee514 ; X86: bb.1 (%ir-block.0):515 ; X86-NEXT: liveins: $xmm0, $xmm1, $xmm2516 ; X86-NEXT: {{ $}}517 ; X86-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $xmm0518 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $xmm1519 ; X86-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>)520 ; X86-NEXT: [[COPY2:%[0-9]+]]:_(<4 x s32>) = COPY $xmm2521 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0522 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(<4 x s32>) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (<4 x s32>) from %fixed-stack.0)523 ; X86-NEXT: [[CONCAT_VECTORS1:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY2]](<4 x s32>), [[LOAD]](<4 x s32>)524 ; X86-NEXT: ADJCALLSTACKDOWN32 0, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp525 ; X86-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[CONCAT_VECTORS1]](<8 x s32>)526 ; X86-NEXT: $xmm0 = COPY [[UV]](<4 x s32>)527 ; X86-NEXT: $xmm1 = COPY [[UV1]](<4 x s32>)528 ; X86-NEXT: CALLpcrel32 @split_return_callee, csr_32, implicit $esp, implicit $ssp, implicit $xmm0, implicit $xmm1, implicit-def $xmm0, implicit-def $xmm1529 ; X86-NEXT: [[COPY3:%[0-9]+]]:_(<4 x s32>) = COPY $xmm0530 ; X86-NEXT: [[COPY4:%[0-9]+]]:_(<4 x s32>) = COPY $xmm1531 ; X86-NEXT: [[CONCAT_VECTORS2:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY3]](<4 x s32>), [[COPY4]](<4 x s32>)532 ; X86-NEXT: ADJCALLSTACKUP32 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp533 ; X86-NEXT: [[ADD:%[0-9]+]]:_(<8 x s32>) = G_ADD [[CONCAT_VECTORS]], [[CONCAT_VECTORS2]]534 ; X86-NEXT: [[UV2:%[0-9]+]]:_(<4 x s32>), [[UV3:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[ADD]](<8 x s32>)535 ; X86-NEXT: $xmm0 = COPY [[UV2]](<4 x s32>)536 ; X86-NEXT: $xmm1 = COPY [[UV3]](<4 x s32>)537 ; X86-NEXT: RET 0, implicit $xmm0, implicit $xmm1538 ;539 ; X64-LABEL: name: test_split_return_callee540 ; X64: bb.1 (%ir-block.0):541 ; X64-NEXT: liveins: $xmm0, $xmm1, $xmm2, $xmm3542 ; X64-NEXT: {{ $}}543 ; X64-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $xmm0544 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $xmm1545 ; X64-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>)546 ; X64-NEXT: [[COPY2:%[0-9]+]]:_(<4 x s32>) = COPY $xmm2547 ; X64-NEXT: [[COPY3:%[0-9]+]]:_(<4 x s32>) = COPY $xmm3548 ; X64-NEXT: [[CONCAT_VECTORS1:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY2]](<4 x s32>), [[COPY3]](<4 x s32>)549 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp550 ; X64-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[CONCAT_VECTORS1]](<8 x s32>)551 ; X64-NEXT: $xmm0 = COPY [[UV]](<4 x s32>)552 ; X64-NEXT: $xmm1 = COPY [[UV1]](<4 x s32>)553 ; X64-NEXT: CALL64pcrel32 @split_return_callee, csr_64, implicit $rsp, implicit $ssp, implicit $xmm0, implicit $xmm1, implicit-def $xmm0, implicit-def $xmm1554 ; X64-NEXT: [[COPY4:%[0-9]+]]:_(<4 x s32>) = COPY $xmm0555 ; X64-NEXT: [[COPY5:%[0-9]+]]:_(<4 x s32>) = COPY $xmm1556 ; X64-NEXT: [[CONCAT_VECTORS2:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY4]](<4 x s32>), [[COPY5]](<4 x s32>)557 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp558 ; X64-NEXT: [[ADD:%[0-9]+]]:_(<8 x s32>) = G_ADD [[CONCAT_VECTORS]], [[CONCAT_VECTORS2]]559 ; X64-NEXT: [[UV2:%[0-9]+]]:_(<4 x s32>), [[UV3:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[ADD]](<8 x s32>)560 ; X64-NEXT: $xmm0 = COPY [[UV2]](<4 x s32>)561 ; X64-NEXT: $xmm1 = COPY [[UV3]](<4 x s32>)562 ; X64-NEXT: RET 0, implicit $xmm0, implicit $xmm1563 %call = call <8 x i32> @split_return_callee(<8 x i32> %arg2)564 %r = add <8 x i32> %arg1, %call565 ret <8 x i32> %r566}567 568define void @test_indirect_call(ptr %func) {569 ; X86-LABEL: name: test_indirect_call570 ; X86: bb.1 (%ir-block.0):571 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0572 ; X86-NEXT: [[LOAD:%[0-9]+]]:gr32(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (p0) from %fixed-stack.0, align 16)573 ; X86-NEXT: ADJCALLSTACKDOWN32 0, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp574 ; X86-NEXT: CALL32r [[LOAD]](p0), csr_32, implicit $esp, implicit $ssp575 ; X86-NEXT: ADJCALLSTACKUP32 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp576 ; X86-NEXT: RET 0577 ;578 ; X64-LABEL: name: test_indirect_call579 ; X64: bb.1 (%ir-block.0):580 ; X64-NEXT: liveins: $rdi581 ; X64-NEXT: {{ $}}582 ; X64-NEXT: [[COPY:%[0-9]+]]:gr64(p0) = COPY $rdi583 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp584 ; X64-NEXT: CALL64r [[COPY]](p0), csr_64, implicit $rsp, implicit $ssp585 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp586 ; X64-NEXT: RET 0587 call void %func()588 ret void589}590 591 592declare void @take_char(i8)593define void @test_abi_exts_call(ptr %addr) {594 ; X86-LABEL: name: test_abi_exts_call595 ; X86: bb.1 (%ir-block.0):596 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0597 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (p0) from %fixed-stack.0, align 16)598 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(s8) = G_LOAD [[LOAD]](p0) :: (load (s8) from %ir.addr)599 ; X86-NEXT: ADJCALLSTACKDOWN32 4, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp600 ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $esp601 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0602 ; X86-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)603 ; X86-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD1]](s8)604 ; X86-NEXT: G_STORE [[ANYEXT]](s32), [[PTR_ADD]](p0) :: (store (s8) into stack)605 ; X86-NEXT: CALLpcrel32 @take_char, csr_32, implicit $esp, implicit $ssp606 ; X86-NEXT: ADJCALLSTACKUP32 4, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp607 ; X86-NEXT: ADJCALLSTACKDOWN32 4, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp608 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $esp609 ; X86-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C]](s32)610 ; X86-NEXT: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[LOAD1]](s8)611 ; X86-NEXT: G_STORE [[SEXT]](s32), [[PTR_ADD1]](p0) :: (store (s8) into stack)612 ; X86-NEXT: CALLpcrel32 @take_char, csr_32, implicit $esp, implicit $ssp613 ; X86-NEXT: ADJCALLSTACKUP32 4, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp614 ; X86-NEXT: ADJCALLSTACKDOWN32 4, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp615 ; X86-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $esp616 ; X86-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY2]], [[C]](s32)617 ; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[LOAD1]](s8)618 ; X86-NEXT: G_STORE [[ZEXT]](s32), [[PTR_ADD2]](p0) :: (store (s8) into stack)619 ; X86-NEXT: CALLpcrel32 @take_char, csr_32, implicit $esp, implicit $ssp620 ; X86-NEXT: ADJCALLSTACKUP32 4, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp621 ; X86-NEXT: RET 0622 ;623 ; X64-LABEL: name: test_abi_exts_call624 ; X64: bb.1 (%ir-block.0):625 ; X64-NEXT: liveins: $rdi626 ; X64-NEXT: {{ $}}627 ; X64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi628 ; X64-NEXT: [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[COPY]](p0) :: (load (s8) from %ir.addr)629 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp630 ; X64-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s8)631 ; X64-NEXT: $edi = COPY [[ANYEXT]](s32)632 ; X64-NEXT: CALL64pcrel32 @take_char, csr_64, implicit $rsp, implicit $ssp, implicit $edi633 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp634 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp635 ; X64-NEXT: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[LOAD]](s8)636 ; X64-NEXT: $edi = COPY [[SEXT]](s32)637 ; X64-NEXT: CALL64pcrel32 @take_char, csr_64, implicit $rsp, implicit $ssp, implicit $edi638 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp639 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp640 ; X64-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[LOAD]](s8)641 ; X64-NEXT: $edi = COPY [[ZEXT]](s32)642 ; X64-NEXT: CALL64pcrel32 @take_char, csr_64, implicit $rsp, implicit $ssp, implicit $edi643 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp644 ; X64-NEXT: RET 0645 %val = load i8, ptr %addr646 call void @take_char(i8 %val)647 call void @take_char(i8 signext %val)648 call void @take_char(i8 zeroext %val)649 ret void650}651 652declare void @variadic_callee(ptr, ...)653define void @test_variadic_call_1(ptr %addr_ptr, ptr %val_ptr) {654 ; X86-LABEL: name: test_variadic_call_1655 ; X86: bb.1 (%ir-block.0):656 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1657 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (p0) from %fixed-stack.1, align 16)658 ; X86-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0659 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (p0) from %fixed-stack.0)660 ; X86-NEXT: [[LOAD2:%[0-9]+]]:_(p0) = G_LOAD [[LOAD]](p0) :: (load (p0) from %ir.addr_ptr)661 ; X86-NEXT: [[LOAD3:%[0-9]+]]:_(s32) = G_LOAD [[LOAD1]](p0) :: (load (s32) from %ir.val_ptr)662 ; X86-NEXT: ADJCALLSTACKDOWN32 8, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp663 ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $esp664 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0665 ; X86-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)666 ; X86-NEXT: G_STORE [[LOAD2]](p0), [[PTR_ADD]](p0) :: (store (p0) into stack, align 1)667 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $esp668 ; X86-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 4669 ; X86-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s32)670 ; X86-NEXT: G_STORE [[LOAD3]](s32), [[PTR_ADD1]](p0) :: (store (s32) into stack + 4, align 1)671 ; X86-NEXT: CALLpcrel32 @variadic_callee, csr_32, implicit $esp, implicit $ssp672 ; X86-NEXT: ADJCALLSTACKUP32 8, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp673 ; X86-NEXT: RET 0674 ;675 ; X64-LABEL: name: test_variadic_call_1676 ; X64: bb.1 (%ir-block.0):677 ; X64-NEXT: liveins: $rdi, $rsi678 ; X64-NEXT: {{ $}}679 ; X64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi680 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $rsi681 ; X64-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load (p0) from %ir.addr_ptr)682 ; X64-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[COPY1]](p0) :: (load (s32) from %ir.val_ptr)683 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp684 ; X64-NEXT: $rdi = COPY [[LOAD]](p0)685 ; X64-NEXT: $esi = COPY [[LOAD1]](s32)686 ; X64-NEXT: $al = MOV8ri 0687 ; X64-NEXT: CALL64pcrel32 @variadic_callee, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $esi, implicit $al688 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp689 ; X64-NEXT: RET 0690 %addr = load ptr, ptr %addr_ptr691 %val = load i32, ptr %val_ptr692 call void (ptr, ...) @variadic_callee(ptr %addr, i32 %val)693 ret void694}695 696define void @test_variadic_call_2(ptr %addr_ptr, ptr %val_ptr) {697 ; X86-LABEL: name: test_variadic_call_2698 ; X86: bb.1 (%ir-block.0):699 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1700 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (p0) from %fixed-stack.1, align 16)701 ; X86-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0702 ; X86-NEXT: [[LOAD1:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX1]](p0) :: (invariant load (p0) from %fixed-stack.0)703 ; X86-NEXT: [[LOAD2:%[0-9]+]]:_(p0) = G_LOAD [[LOAD]](p0) :: (load (p0) from %ir.addr_ptr)704 ; X86-NEXT: [[LOAD3:%[0-9]+]]:_(s64) = G_LOAD [[LOAD1]](p0) :: (load (s64) from %ir.val_ptr, align 4)705 ; X86-NEXT: ADJCALLSTACKDOWN32 12, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp706 ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $esp707 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0708 ; X86-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s32)709 ; X86-NEXT: G_STORE [[LOAD2]](p0), [[PTR_ADD]](p0) :: (store (p0) into stack, align 1)710 ; X86-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $esp711 ; X86-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 4712 ; X86-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s32)713 ; X86-NEXT: G_STORE [[LOAD3]](s64), [[PTR_ADD1]](p0) :: (store (s64) into stack + 4, align 1)714 ; X86-NEXT: CALLpcrel32 @variadic_callee, csr_32, implicit $esp, implicit $ssp715 ; X86-NEXT: ADJCALLSTACKUP32 12, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp716 ; X86-NEXT: RET 0717 ;718 ; X64-LABEL: name: test_variadic_call_2719 ; X64: bb.1 (%ir-block.0):720 ; X64-NEXT: liveins: $rdi, $rsi721 ; X64-NEXT: {{ $}}722 ; X64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi723 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $rsi724 ; X64-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[COPY]](p0) :: (load (p0) from %ir.addr_ptr)725 ; X64-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[COPY1]](p0) :: (load (s64) from %ir.val_ptr)726 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp727 ; X64-NEXT: $rdi = COPY [[LOAD]](p0)728 ; X64-NEXT: $xmm0 = COPY [[LOAD1]](s64)729 ; X64-NEXT: $al = MOV8ri 1730 ; X64-NEXT: CALL64pcrel32 @variadic_callee, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $xmm0, implicit $al731 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp732 ; X64-NEXT: RET 0733 %addr = load ptr, ptr %addr_ptr734 %val = load double, ptr %val_ptr735 call void (ptr, ...) @variadic_callee(ptr %addr, double %val)736 ret void737}738 739; Return value is in memory unless subtarget is AVX or higher.740define <32 x float> @test_return_v32f32() {741 ; X86-LABEL: name: test_return_v32f32742 ; X86: bb.1 (%ir-block.0):743 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0744 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (s32) from %fixed-stack.0, align 16)745 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 0.000000e+00746 ; X86-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<32 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)747 ; X86-NEXT: G_STORE [[BUILD_VECTOR]](<32 x s32>), [[LOAD]](p0) :: (store (<32 x s32>))748 ; X86-NEXT: $eax = COPY [[LOAD]](p0)749 ; X86-NEXT: RET 0, $eax750 ;751 ; X64-LABEL: name: test_return_v32f32752 ; X64: bb.1 (%ir-block.0):753 ; X64-NEXT: liveins: $rdi754 ; X64-NEXT: {{ $}}755 ; X64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi756 ; X64-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 0.000000e+00757 ; X64-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<32 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)758 ; X64-NEXT: G_STORE [[BUILD_VECTOR]](<32 x s32>), [[COPY]](p0) :: (store (<32 x s32>))759 ; X64-NEXT: $rax = COPY [[COPY]](p0)760 ; X64-NEXT: RET 0, $rax761 ret <32 x float> zeroinitializer762}763 764define float @test_call_v32f32() {765 ; X86-LABEL: name: test_call_v32f32766 ; X86: bb.1 (%ir-block.0):767 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 7768 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0769 ; X86-NEXT: ADJCALLSTACKDOWN32 4, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp770 ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $esp771 ; X86-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0772 ; X86-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C1]](s32)773 ; X86-NEXT: G_STORE [[FRAME_INDEX]](p0), [[PTR_ADD]](p0) :: (store (p0) into stack, align 1)774 ; X86-NEXT: CALLpcrel32 @test_return_v32f32, csr_32, implicit $esp, implicit $ssp775 ; X86-NEXT: ADJCALLSTACKUP32 4, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp776 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(<32 x s32>) = G_LOAD [[FRAME_INDEX]](p0) :: (load (<32 x s32>) from %stack.0)777 ; X86-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[LOAD]](<32 x s32>), [[C]](s32)778 ; X86-NEXT: $fp0 = COPY [[EVEC]](s32)779 ; X86-NEXT: RET 0, implicit $fp0780 ;781 ; X64-LABEL: name: test_call_v32f32782 ; X64: bb.1 (%ir-block.0):783 ; X64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 7784 ; X64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0785 ; X64-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp786 ; X64-NEXT: $rdi = COPY [[FRAME_INDEX]](p0)787 ; X64-NEXT: CALL64pcrel32 @test_return_v32f32, csr_64, implicit $rsp, implicit $ssp, implicit $rdi788 ; X64-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp789 ; X64-NEXT: [[LOAD:%[0-9]+]]:_(<32 x s32>) = G_LOAD [[FRAME_INDEX]](p0) :: (load (<32 x s32>) from %stack.0)790 ; X64-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[LOAD]](<32 x s32>), [[C]](s64)791 ; X64-NEXT: $xmm0 = COPY [[EVEC]](s32)792 ; X64-NEXT: RET 0, implicit $xmm0793 %vect = call <32 x float> @test_return_v32f32()794 %elt = extractelement <32 x float> %vect, i32 7795 ret float %elt796}797 798define void @test_sret(ptr sret(%struct.all) align 8 %result) #0 {799 ; X86-LABEL: name: test_sret800 ; X86: bb.1.entry:801 ; X86-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0802 ; X86-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (invariant load (p0) from %fixed-stack.0, align 16)803 ; X86-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 104804 ; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY [[LOAD]](p0)805 ; X86-NEXT: G_STORE [[C]](s8), [[COPY]](p0) :: (store (s8) into %ir.c, align 8)806 ; X86-NEXT: $eax = COPY [[LOAD]](p0)807 ; X86-NEXT: RET 0, $eax808 ;809 ; X64-LABEL: name: test_sret810 ; X64: bb.1.entry:811 ; X64-NEXT: liveins: $rdi812 ; X64-NEXT: {{ $}}813 ; X64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi814 ; X64-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 104815 ; X64-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY [[COPY]](p0)816 ; X64-NEXT: G_STORE [[C]](s8), [[COPY1]](p0) :: (store (s8) into %ir.c, align 8)817 ; X64-NEXT: $rax = COPY [[COPY]](p0)818 ; X64-NEXT: RET 0, $rax819entry:820 %c = getelementptr inbounds %struct.all, ptr %result, i32 0, i32 0821 store i8 104, ptr %c, align 8822 ret void823}824