[LLVMdev] GVN fails with bitcasts
Nick Lewycky
nicholas at mxc.ca
Sat Dec 14 00:14:15 PST 2013
Carl-Philip Hänsch wrote:
> Hi,
>
> i have the following code:
> define internal %"struct.dexter::ConditionConstant"*
> @_ZN6dexter18BinaryConditionAdd8evaluateEv5(%"class.dexter::BinaryConditionAdd"*)
> {
> entry:
> %1 = getelementptr inbounds %"class.dexter::BinaryConditionAdd"* %0,
> i32 0, i32 0, i32 1
> %2 = load %"class.dexter::BaseCondition"** %1, align 8
> %3 = bitcast %"class.dexter::BaseCondition"* %2 to
> %"class.dexter::BinaryConditionAdd"*
> %4 = getelementptr inbounds %"class.dexter::BinaryConditionAdd"* %3,
> i32 0, i32 0, i32 0, i32 1, i32 0
> %5 = bitcast %union.anon* %4 to i64*
> store i64 4, i64* %5, align 8
> %6 = getelementptr inbounds %"class.dexter::BinaryConditionAdd"* %3,
> i32 0, i32 0, i32 0, i32 1
> %7 = bitcast %"struct.dexter::ConditionConstant"* %6 to i64*
> %8 = load i64* %7, align 8
> %9 = add nsw i64 %8, 2
> %10 = getelementptr inbounds %"class.dexter::BinaryConditionAdd"* %0,
> i32 0, i32 0, i32 0, i32 1, i32 0
> %11 = bitcast %union.anon* %10 to i64*
> store i64 %9, i64* %11, align 8
> %12 = getelementptr inbounds %"class.dexter::BinaryConditionAdd"* %0,
> i32 0, i32 0, i32 0, i32 1
> ret %"struct.dexter::ConditionConstant"* %12
> }
>
> %5 and %7 point to the same memory location. This is not detected
> because %4 and %6 look different. But they have the same offset and the
> bitcast creates. Do you have an idea how to fix that?
Without seeing the definition of class.dexter::BinaryConditionAdd it's
hard to tell. Is the element it's pointing to actually an i64? If it is,
then we could canonicalize the gep+bitcast to just a gep. If not, then
we need to have a GEP+bitcast situation, but it's possible that when we
see a GEP with a single use bitcast, we could canonicalize by stripping
trailing zeroes off the GEP?
If instcombine did that, would GVN then be able to solve this?
Nick
More information about the llvm-dev
mailing list