@@ -69,24 +69,6 @@ struct ArmTargetABI : TargetABI {
69
69
// problem is better understood.
70
70
}
71
71
72
- void rewriteFunctionType (IrFuncTy &fty) override {
73
- Type *retTy = fty.ret ->type ->toBasetype ();
74
- if (!fty.ret ->byref && retTy->ty == TY::Tstruct) {
75
- // Rewrite HFAs only because union HFAs are turned into IR types that are
76
- // non-HFA and messes up register selection
77
- if (isHFVA (retTy, hfvaToArray.maxElements , &fty.ret ->ltype )) {
78
- hfvaToArray.applyTo (*fty.ret , fty.ret ->ltype );
79
- } else {
80
- integerRewrite.applyTo (*fty.ret );
81
- }
82
- }
83
-
84
- for (auto arg : fty.args ) {
85
- if (!arg->byref )
86
- rewriteArgument (fty, *arg);
87
- }
88
- }
89
-
90
72
void rewriteArgument (IrFuncTy &fty, IrFuncTyArg &arg) override {
91
73
// structs and arrays need rewrite as i32 arrays. This keeps data layout
92
74
// unchanged when passed in registers r0-r3 and is necessary to match C ABI
@@ -95,6 +77,8 @@ struct ArmTargetABI : TargetABI {
95
77
// r0, where before it consumed r0-r3.
96
78
Type *ty = arg.type ->toBasetype ();
97
79
80
+ const bool isReturnValue = &arg == fty.ret ;
81
+
98
82
// TODO: want to also rewrite Tsarray as i32 arrays, but sometimes
99
83
// llvm selects an aligned ldrd instruction even though the ptr is
100
84
// unaligned (e.g. walking through members of array char[5][]).
@@ -104,6 +88,8 @@ struct ArmTargetABI : TargetABI {
104
88
// non-HFA and messes up register selection
105
89
if (isHFVA (ty, hfvaToArray.maxElements , &arg.ltype )) {
106
90
hfvaToArray.applyTo (arg, arg.ltype );
91
+ } else if (isReturnValue) {
92
+ integerRewrite.applyTo (arg);
107
93
} else if (DtoAlignment (ty) <= 4 ) {
108
94
compositeToArray32.applyTo (arg);
109
95
} else {
0 commit comments