[llvm] r179569 - We are not able to bitcast a pointer to an integral value.

Duncan Sands baldrick at free.fr
Tue Apr 16 09:42:43 PDT 2013


Hi Bill,

On 16/04/13 00:33, Bill Wendling wrote:
> Author: void
> Date: Mon Apr 15 17:33:50 2013
> New Revision: 179569
>
> URL: http://llvm.org/viewvc/llvm-project?rev=179569&view=rev
> Log:
> We are not able to bitcast a pointer to an integral value.
>
> Two return types are not equivalent if one is a pointer and the other is an
> integral. This is because we cannot bitcast a pointer to an integral value.
> PR15185

you can always ptrtoint it.  I thought the idea of mergefunctions was to
ignore types, and consider two values the same if they have the same bits,
regardless of whether they are pointers, integers, floats or whatever.  If
so, it seems a pity to suddenly decide that type differences matter.

Ciao, Duncan.

>
> Added:
>      llvm/trunk/test/Transforms/MergeFunc/crash.ll
> Modified:
>      llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp
>
> Modified: llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp?rev=179569&r1=179568&r2=179569&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp Mon Apr 15 17:33:50 2013
> @@ -185,7 +185,7 @@ private:
>     }
>
>     /// Compare two Types, treating all pointer types as equal.
> -  bool isEquivalentType(Type *Ty1, Type *Ty2) const;
> +  bool isEquivalentType(Type *Ty1, Type *Ty2, bool isReturnType = false) const;
>
>     // The two functions undergoing comparison.
>     const Function *F1, *F2;
> @@ -200,12 +200,12 @@ private:
>
>   // Any two pointers in the same address space are equivalent, intptr_t and
>   // pointers are equivalent. Otherwise, standard type equivalence rules apply.
> -bool FunctionComparator::isEquivalentType(Type *Ty1,
> -                                          Type *Ty2) const {
> +bool FunctionComparator::isEquivalentType(Type *Ty1, Type *Ty2,
> +                                          bool isReturnType) const {
>     if (Ty1 == Ty2)
>       return true;
>     if (Ty1->getTypeID() != Ty2->getTypeID()) {
> -    if (TD) {
> +    if (TD && !isReturnType) {
>         LLVMContext &Ctx = Ty1->getContext();
>         if (isa<PointerType>(Ty1) && Ty2 == TD->getIntPtrType(Ctx)) return true;
>         if (isa<PointerType>(Ty2) && Ty1 == TD->getIntPtrType(Ctx)) return true;
> @@ -261,7 +261,7 @@ bool FunctionComparator::isEquivalentTyp
>           FTy1->isVarArg() != FTy2->isVarArg())
>         return false;
>
> -    if (!isEquivalentType(FTy1->getReturnType(), FTy2->getReturnType()))
> +    if (!isEquivalentType(FTy1->getReturnType(), FTy2->getReturnType(), true))
>         return false;
>
>       for (unsigned i = 0, e = FTy1->getNumParams(); i != e; ++i) {
>
> Added: llvm/trunk/test/Transforms/MergeFunc/crash.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/MergeFunc/crash.ll?rev=179569&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/MergeFunc/crash.ll (added)
> +++ llvm/trunk/test/Transforms/MergeFunc/crash.ll Mon Apr 15 17:33:50 2013
> @@ -0,0 +1,46 @@
> +; RUN: opt -mergefunc -disable-output < %s
> +; PR15185
> +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
> +target triple = "i386-pc-linux-gnu"
> +
> +%.qux.2496 = type { i32, %.qux.2497 }
> +%.qux.2497 = type { i8, i32 }
> +%.qux.2585 = type { i32, i32, i8* }
> +
> + at g2 = external unnamed_addr constant [9 x i8], align 1
> + at g3 = internal hidden unnamed_addr constant [1 x i8*] [i8* bitcast (i8* (%.qux.2585*)* @func35 to i8*)]
> +
> +define internal hidden i32 @func1(i32* %ptr, { i32, i32 }* nocapture %method) align 2 {
> +  br label %1
> +
> +; <label>:1
> +  br label %2
> +
> +; <label>:2
> +  ret i32 undef
> +}
> +
> +define internal hidden i32 @func10(%.qux.2496* nocapture %this) align 2 {
> +  %1 = getelementptr inbounds %.qux.2496* %this, i32 0, i32 1, i32 1
> +  %2 = load i32* %1, align 4
> +  ret i32 %2
> +}
> +
> +define internal hidden i8* @func29(i32* nocapture %this) align 2 {
> +  ret i8* getelementptr inbounds ([9 x i8]* @g2, i32 0, i32 0)
> +}
> +
> +define internal hidden i32* @func33(%.qux.2585* nocapture %this) align 2 {
> +  ret i32* undef
> +}
> +
> +define internal hidden i32* @func34(%.qux.2585* nocapture %this) align 2 {
> +  %1 = getelementptr inbounds %.qux.2585* %this, i32 0
> +  ret i32* undef
> +}
> +
> +define internal hidden i8* @func35(%.qux.2585* nocapture %this) align 2 {
> +  %1 = getelementptr inbounds %.qux.2585* %this, i32 0, i32 2
> +  %2 = load i8** %1, align 4
> +  ret i8* %2
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list