diff options
author | Chris Lattner <sabre@nondot.org> | 2011-01-13 22:08:15 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-01-13 22:08:15 +0000 |
commit | b9cdf393a41a85bdfde6fbf86dd34cefee2a5691 (patch) | |
tree | b3b19b43c9d46f04f14c561e427d977cdaf0bf29 /llvm/lib/Target | |
parent | c3c7f5dd567d1f76d2217f7b7a533706e9bd73e8 (diff) | |
download | bcm5719-llvm-b9cdf393a41a85bdfde6fbf86dd34cefee2a5691.tar.gz bcm5719-llvm-b9cdf393a41a85bdfde6fbf86dd34cefee2a5691.zip |
memcpy + metadata = bliss :)
llvm-svn: 123405
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/README.txt | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/llvm/lib/Target/README.txt b/llvm/lib/Target/README.txt index c3a9330ba6e..16be2e9004f 100644 --- a/llvm/lib/Target/README.txt +++ b/llvm/lib/Target/README.txt @@ -2259,3 +2259,51 @@ Since we know that x+2.0 doesn't care about the sign of any zeros in X, we can transform the fmul to 0.0, and then the fadd to 2.0. //===---------------------------------------------------------------------===// + +We should enhance memcpy/memcpy/memset to allow a metadata node on them +indicating that some bytes of the transfer are undefined. This is useful for +frontends like clang when lowering struct lowering, when some elements of the +struct are undefined. Consider something like this: + +struct x { + char a; + int b[4]; +}; +void foo(struct x*P); +struct x testfunc() { + struct x V1, V2; + foo(&V1); + V2 = V1; + + return V2; +} + +We currently compile this to: +$ clang t.c -S -o - -O0 -emit-llvm | opt -scalarrepl -S + + +%struct.x = type { i8, [4 x i32] } + +define void @testfunc(%struct.x* sret %agg.result) nounwind ssp { +entry: + %V1 = alloca %struct.x, align 4 + call void @foo(%struct.x* %V1) + %tmp1 = bitcast %struct.x* %V1 to i8* + %0 = bitcast %struct.x* %V1 to i160* + %srcval1 = load i160* %0, align 4 + %tmp2 = bitcast %struct.x* %agg.result to i8* + %1 = bitcast %struct.x* %agg.result to i160* + store i160 %srcval1, i160* %1, align 4 + ret void +} + +This happens because SRoA sees that the temp alloca has is being memcpy'd into +and out of and it has holes and it has to be conservative. If we knew about the +holes, then this could be much much better. + +Having information about these holes would also improve memcpy (etc) lowering at +llc time when it gets inlined, because we can use smaller transfers. This also +avoids partial register stalls in some important cases. + +//===---------------------------------------------------------------------===// + |