Hi, Recently, I noticed that less number of global variables are merged in global-merge pass and in some global variable, array types are used instead of its original type. For example, [4xi8] with align 4 is used for a i32 global variable. For me, it seems that such pattern is observed after r278338 (Resolution-based LTO API). Can anyone give me little bit more insight if such type change was intended? If then why such uses of array type is needed? Thanks, Jun -- Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
Mehdi Amini via llvm-dev
2016-Aug-26 15:32 UTC
[llvm-dev] Use of array type in globals in LTO
Hi,> Recently, I noticed that less number of global variables are merged in global-merge pass and in some global variable, array types are used instead of its original type. For example, [4xi8] with align 4 is used for a i32 global variable. For me, it seems that such pattern is observed after r278338 (Resolution-based LTO API).Are you sure it is performed in the global merge pass? Can you provide an example of input IR where you see this now but didn’t before? Also can you confirm you’re using the gold-linker?> Can anyone give me little bit more insight if such type change was intended? If then why such uses of array type is needed?The transformation I know of is the common variables merging, bug it is not new. We use an array because we have to merge globals from different size and an array of bytes is the most straightforward representation for that. — Mehdi
On 2016-08-26 11:32, Mehdi Amini wrote:> Hi, > >> Recently, I noticed that less number of global variables are merged in >> global-merge pass and in some global variable, array types are used >> instead of its original type. For example, [4xi8] with align 4 is used >> for a i32 global variable. For me, it seems that such pattern is >> observed after r278338 (Resolution-based LTO API). > > Are you sure it is performed in the global merge pass? Can you provide > an example of input IR where you see this now but didn’t before? > Also can you confirm you’re using the gold-linker?I used gold linker. In spec2006/perlbench, I observed the less number of globals are merged in GlobalMerge.cpp after r278338. The reason is because, from the very first pass, several global variables use [4xi8] with align 4, instead of its original type i32 after r278338. Current GlobalMerge pass doesn't seem to handle such fancy-aligned globals. If such type change (e.g., from i32 to [4xi8]) in global variables was intended in r278338, I think we should enhance GlobalMerge to handle such cases.> >> Can anyone give me little bit more insight if such type change was >> intended? If then why such uses of array type is needed? > > The transformation I know of is the common variables merging, bug it > is not new. We use an array because we have to merge globals from > different size and an array of bytes is the most straightforward > representation for that. > > — > Mehdi-- Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.