diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-06-27 06:26:04 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-06-27 06:26:04 +0000 |
| commit | 055097f0249a08a78b7acc3c047e265dec11c0c9 (patch) | |
| tree | 84e002796af6d3a67bfd2262a8417171ef1d2834 /clang/test/CodeGen | |
| parent | 895c52ba8ba8e3a70882c83c0dee6c035a7551c5 (diff) | |
| download | bcm5719-llvm-055097f0249a08a78b7acc3c047e265dec11c0c9.tar.gz bcm5719-llvm-055097f0249a08a78b7acc3c047e265dec11c0c9.zip | |
If coercing something from int or pointer type to int or pointer type
(potentially after unwrapping it from a struct) do it without going through
memory. We now compile:
struct DeclGroup {
unsigned NumDecls;
};
int foo(DeclGroup D) {
return D.NumDecls;
}
into:
%struct.DeclGroup = type { i32 }
define i32 @_Z3foo9DeclGroup(i64) nounwind ssp noredzone {
entry:
%D = alloca %struct.DeclGroup, align 4 ; <%struct.DeclGroup*> [#uses=2]
%coerce.dive = getelementptr %struct.DeclGroup* %D, i32 0, i32 0 ; <i32*> [#uses=1]
%coerce.val.ii = trunc i64 %0 to i32 ; <i32> [#uses=1]
store i32 %coerce.val.ii, i32* %coerce.dive
%tmp = getelementptr inbounds %struct.DeclGroup* %D, i32 0, i32 0 ; <i32*> [#uses=1]
%tmp1 = load i32* %tmp ; <i32> [#uses=1]
ret i32 %tmp1
}
instead of:
%struct.DeclGroup = type { i32 }
define i32 @_Z3foo9DeclGroup(i64) nounwind ssp noredzone {
entry:
%D = alloca %struct.DeclGroup, align 4 ; <%struct.DeclGroup*> [#uses=2]
%tmp = alloca i64 ; <i64*> [#uses=2]
%coerce.dive = getelementptr %struct.DeclGroup* %D, i32 0, i32 0 ; <i32*> [#uses=1]
store i64 %0, i64* %tmp
%1 = bitcast i64* %tmp to i32* ; <i32*> [#uses=1]
%2 = load i32* %1, align 1 ; <i32> [#uses=1]
store i32 %2, i32* %coerce.dive
%tmp1 = getelementptr inbounds %struct.DeclGroup* %D, i32 0, i32 0 ; <i32*> [#uses=1]
%tmp2 = load i32* %tmp1 ; <i32> [#uses=1]
ret i32 %tmp2
}
... which is quite a bit less terrifying.
llvm-svn: 106975
Diffstat (limited to 'clang/test/CodeGen')
| -rw-r--r-- | clang/test/CodeGen/x86_64-arguments.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/clang/test/CodeGen/x86_64-arguments.c b/clang/test/CodeGen/x86_64-arguments.c index b53dfdf93dd..d182aa25d91 100644 --- a/clang/test/CodeGen/x86_64-arguments.c +++ b/clang/test/CodeGen/x86_64-arguments.c @@ -93,8 +93,7 @@ void f17(float a, float b, float c, float d, float e, float f, float g, float h, long double X) {} // Check for valid coercion. -// CHECK: [[f18_t0:%.*]] = bitcast i64* {{.*}} to i32* -// CHECK: [[f18_t1:%.*]] = load i32* [[f18_t0]], align 1 +// CHECK: [[f18_t1:%.*]] = trunc i64 {{.*}} to i32 // CHECK: store i32 [[f18_t1]], i32* struct f18_s0 { int f0; }; void f18(int a, struct f18_s0 f18_arg1) { while (1) {} } |

