-
Notifications
You must be signed in to change notification settings - Fork 15.8k
Closed
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzillallvm-toolsAll llvm tools that do not have corresponding tagAll llvm tools that do not have corresponding tagmiscompilation
Description
| Bugzilla Link | 603 |
| Resolution | FIXED |
| Resolved on | Feb 22, 2010 12:41 |
| Version | 1.0 |
| OS | MacOS X |
| Blocks | #821 |
Extended Description
llvm-gcc is currently miscompiling the following code:
typedef union {
int A; long long L;
} X;
typedef struct {
X x;
int B;
} Y;
Y* foo(Y *l) { return l+1; }
In this case, the X union should have 8-byte alignment due to funny darwin rules (even though long
long's are normally only 4-byte aligned). When X is the first element of a struct, that increases its
alignment requirements to 8-bytes, which increases the size of Y from 12 to 16 bytes.
llvm-gcc currently compiles this to:
%struct.Y = type { %union.X, int }
%union.X = type { long }
%struct.Y* %_Z3fooP1Y(%struct.Y* %l) {
%tmp.2 = getelementptr %struct.Y* %l, int 1 ; <%struct.Y*> [#uses=1]
ret %struct.Y* %tmp.2
}
... which is incorrect: Y is only 12 bytes in size. This causes us to emit the following PPC code:
__Z3fooP1Y:
addi r3, r3, 12
blr
... instead of the correct code:
__Z3fooP1Y:
addi r3, r3, 16
blr
This problem was reduced from Bug 449.
-Chris
Metadata
Metadata
Assignees
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzillallvm-toolsAll llvm tools that do not have corresponding tagAll llvm tools that do not have corresponding tagmiscompilation