Commit 6c90f137 by Uros Bizjak Committed by Uros Bizjak

re PR target/60017 (Struct not returned correctly)

	PR target/60017
	* config/i386/i386.c (classify_argument): Fix handling of bit_offset
	when calculating size of integer atomic types.

testsuite/ChangeLog:

	PR target/60017
	* gcc.c-torture/execute/pr60017.c: New test.

From-SVN: r207399
parent 5e64bbbb
2014-02-02 Uros Bizjak <ubizjak@gmail.com>
PR target/60017
* config/i386/i386.c (classify_argument): Fix handling of bit_offset
when calculating size of integer atomic types.
2014-02-02 H.J. Lu <hongjiu.lu@intel.com>
* ipa-inline-analysis.c (true_predicate_p): Fix a typo in comments.
......
......@@ -6627,25 +6627,28 @@ classify_argument (enum machine_mode mode, const_tree type,
case CHImode:
case CQImode:
{
int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
int size = bit_offset + (int) GET_MODE_BITSIZE (mode);
if (size <= 32)
/* Analyze last 128 bits only. */
size = (size - 1) & 0x7f;
if (size < 32)
{
classes[0] = X86_64_INTEGERSI_CLASS;
return 1;
}
else if (size <= 64)
else if (size < 64)
{
classes[0] = X86_64_INTEGER_CLASS;
return 1;
}
else if (size <= 64+32)
else if (size < 64+32)
{
classes[0] = X86_64_INTEGER_CLASS;
classes[1] = X86_64_INTEGERSI_CLASS;
return 2;
}
else if (size <= 64+64)
else if (size < 64+64)
{
classes[0] = classes[1] = X86_64_INTEGER_CLASS;
return 2;
2014-02-02 Uros Bizjak <ubizjak@gmail.com>
PR target/60017
* gcc.c-torture/execute/pr60017.c: New test.
2014-02-02 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/57033
......
/* PR target/60017 */
extern void abort (void);
struct S0
{
short m0;
short m1;
};
struct S1
{
unsigned m0:1;
char m1[2][2];
struct S0 m2[2];
};
struct S1 x = { 1, {{2, 3}, {4, 5}}, {{6, 7}, {8, 9}} };
struct S1 func (void)
{
return x;
}
int main (void)
{
struct S1 ret = func ();
if (ret.m2[1].m1 != 9)
abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment