You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[X86][ABI] Don't preserve return regs for preserve_all/preserve_most CCs
Currently both calling conventions preserve registers that are used to
store a return value. This causes the returned value to be lost:
define i32 @bar() {
%1 = call preserve_mostcc i32 @foo()
ret i32 %1
}
define preserve_mostcc i32 @foo() {
ret i32 2
; preserve_mostcc will restore %rax,
; whatever it was before the call.
}
This contradicts the current documentation (preserve_allcc "behaves
identical to the `C` calling conventions on how arguments and return
values are passed") and also breaks [[clang::preserve_most]].
This change makes CSRs be preserved iff they are not used to store a
return value (e.g. %rax for scalars, {%rax:%rdx} for __int128, %xmm0
for double). For void functions no additional registers are
preserved, i.e. the behaviour is backward compatible with existing
code.
Differential Revision: https://reviews.llvm.org/D141020
%a10 = call <2 x double> asmsideeffect"", "={xmm0}"() nounwind
36
+
%a11 = call <2 x double> asmsideeffect"", "={xmm1}"() nounwind
37
+
%a12 = call <2 x double> asmsideeffect"", "={xmm2}"() nounwind
38
+
%a13 = call <2 x double> asmsideeffect"", "={xmm3}"() nounwind
39
+
%a14 = call <2 x double> asmsideeffect"", "={xmm4}"() nounwind
40
+
%a15 = call <2 x double> asmsideeffect"", "={xmm5}"() nounwind
41
+
%a16 = call <2 x double> asmsideeffect"", "={xmm6}"() nounwind
42
+
%a17 = call <2 x double> asmsideeffect"", "={xmm7}"() nounwind
43
+
%a18 = call <2 x double> asmsideeffect"", "={xmm8}"() nounwind
44
+
%a19 = call <2 x double> asmsideeffect"", "={xmm9}"() nounwind
45
+
%a20 = call <2 x double> asmsideeffect"", "={xmm10}"() nounwind
46
+
%a21 = call <2 x double> asmsideeffect"", "={xmm11}"() nounwind
47
+
%a22 = call <2 x double> asmsideeffect"", "={xmm12}"() nounwind
48
+
%a23 = call <2 x double> asmsideeffect"", "={xmm13}"() nounwind
49
+
%a24 = call <2 x double> asmsideeffect"", "={xmm14}"() nounwind
50
+
%a25 = call <2 x double> asmsideeffect"", "={xmm15}"() nounwind
51
+
call preserve_allcc double@bar_double(i641, i642)
52
+
callvoidasmsideeffect"", "{rax},{rcx},{rdx},{r8},{r9},{r10},{r11},{xmm0},{xmm1},{xmm2},{xmm3},{xmm4},{xmm5},{xmm6},{xmm7},{xmm8},{xmm9},{xmm10},{xmm11},{xmm12},{xmm13},{xmm14},{xmm15}"(i64%a0, i64%a1, i64%a2, i64%a3, i64%a4, i64%a5, i64%a6, <2 x double> %a10, <2 x double> %a11, <2 x double> %a12, <2 x double> %a13, <2 x double> %a14, <2 x double> %a15, <2 x double> %a16, <2 x double> %a17, <2 x double> %a18, <2 x double> %a19, <2 x double> %a20, <2 x double> %a21, <2 x double> %a22, <2 x double> %a23, <2 x double> %a24, <2 x double> %a25)
callvoidasmsideeffect"", "{rax},{rcx},{rdx},{r8},{r9},{r10},{r11},{xmm2},{xmm3},{xmm4},{xmm5},{xmm6},{xmm7},{xmm8},{xmm9},{xmm10},{xmm11},{xmm12},{xmm13},{xmm14},{xmm15}"(i64%a0, i64%a1, i64%a2, i64%a3, i64%a4, i64%a5, i64%a6, <2 x double> %a10, <2 x double> %a11, <2 x double> %a12, <2 x double> %a13, <2 x double> %a14, <2 x double> %a15, <2 x double> %a16, <2 x double> %a17, <2 x double> %a18, <2 x double> %a19, <2 x double> %a20, <2 x double> %a21, <2 x double> %a22, <2 x double> %a23)
callvoidasmsideeffect"", "{rax},{rcx},{rdx},{r8},{r9},{r10},{r11},{xmm0},{xmm1},{xmm2},{xmm3},{xmm4},{xmm5},{xmm6},{xmm7},{xmm8},{xmm9},{xmm10},{xmm11},{xmm12},{xmm13},{xmm14},{xmm15}"(i64%a0, i64%a1, i64%a2, i64%a3, i64%a4, i64%a5, i64%a6, <2 x double> %a10, <2 x double> %a11, <2 x double> %a12, <2 x double> %a13, <2 x double> %a14, <2 x double> %a15, <2 x double> %a16, <2 x double> %a17, <2 x double> %a18, <2 x double> %a19, <2 x double> %a20, <2 x double> %a21, <2 x double> %a22, <2 x double> %a23, <2 x double> %a24, <2 x double> %a25)
0 commit comments