Gabi
2010-Apr-04 22:55 UTC
[LLVMdev] Code generators (both llvmc and Jit) get stuck when dealing circular CFG
Hi, The following arbitrary example makes the code generators to get stuck (llvmc won't return from command line, Jit won't return from function call) Basically it is a CFG with circles, (the function will return by comparing a branch counter to a threshold on runtime - see the "Brancher" blocks below) Any idea what goes wrong? Is it a bug in llvm ? ; ModuleID = 'TestModule!' define double @fn1(i8*, i64) { Entry: %BranchCounter = alloca i32 ; <i32*> [#uses=7] store i32 0, i32* %BranchCounter %Vars = alloca double, i32 3 ; <double*> [#uses=3] %DoubleVar = getelementptr inbounds double* %Vars, i32 0 ; <double*> [#uses=6] store double 0xC031AD5A40000000, double* %DoubleVar %DoubleVar1 = getelementptr inbounds double* %Vars, i32 1 ; <double*> [#uses=1] store double 0xC055A9E9E0000000, double* %DoubleVar1 %DoubleVar2 = getelementptr inbounds double* %Vars, i32 2 ; <double*> [#uses=4] store double 0xC0495B8A80000000, double* %DoubleVar2 br label %Brancher Exit: ; preds %Brancher7, %Brancher4, %Brancher %2 = load double* %DoubleVar ; <double> [#uses=1] ret double %2 Body: ; preds = %Brancher %3 = srem i64 30, %1 ; <i64> [#uses=1] %4 = getelementptr inbounds i8* %0, i64 %3 ; <i8*> [#uses=1] %5 = load i8* %4 ; <i8> [#uses=1] %PeekResult = uitofp i8 %5 to double ; <double> [#uses=0] %6 = load double* %DoubleVar2 ; <double> [#uses=1] store double 0x40619C4E80000000, double* %DoubleVar %7 = srem i64 178, %1 ; <i64> [#uses=1] %8 = getelementptr inbounds i8* %0, i64 %7 ; <i8*> [#uses=1] %9 = load i8* %8 ; <i8> [#uses=1] %PeekResult9 = uitofp i8 %9 to double ; <double> [#uses=0] store double %6, double* %DoubleVar %10 = load double* %DoubleVar2 ; <double> [#uses=0] %11 = load double* %DoubleVar ; <double> [#uses=0] br i1 false, label %Brancher7, label %Brancher4 Brancher: ; preds = %Entry %12 = load i32* %BranchCounter ; <i32> [#uses=1] %"BrCounter++" = add i32 %12, 1 ; <i32> [#uses=2] store i32 %"BrCounter++", i32* %BranchCounter %13 = icmp ult i32 %"BrCounter++", 10 ; <i1> [#uses=1] br i1 %13, label %Body, label %Exit Body3: ; preds = %Brancher4 %14 = srem i64 40, %1 ; <i64> [#uses=1] %15 = getelementptr inbounds i8* %0, i64 %14 ; <i8*> [#uses=1] %16 = load i8* %15 ; <i8> [#uses=1] %PeekResult10 = uitofp i8 %16 to double ; <double> [#uses=2] %17 = fsub double 0xC058173FC0000000, %PeekResult10 ; <double> [#uses=1] store double %PeekResult10, double* %DoubleVar2 %18 = fsub double 0x406AB76488000000, %17 ; <double> [#uses=1] %19 = fdiv double %18, 0x4068C87680000000 ; <double> [#uses=0] br label %Brancher4 Brancher4: ; preds = %Body6, %Body3, %Body %20 = load i32* %BranchCounter ; <i32> [#uses=1] %"BrCounter++5" = add i32 %20, 1 ; <i32> [#uses=2] store i32 %"BrCounter++5", i32* %BranchCounter %21 = icmp ult i32 %"BrCounter++5", 10 ; <i1> [#uses=1] br i1 %21, label %Body3, label %Exit Body6: ; preds = %Brancher7 %22 = load double* %DoubleVar ; <double> [#uses=3] %23 = srem i64 7118, %1 ; <i64> [#uses=1] %24 = getelementptr inbounds i8* %0, i64 %23 ; <i8*> [#uses=1] %25 = load i8* %24 ; <i8> [#uses=1] %PeekResult11 = uitofp i8 %25 to double ; <double> [#uses=0] %26 = fsub double %22, %22 ; <double> [#uses=0] %27 = fcmp oeq double 0xC04FBB2E40000000, %22 ; <i1> [#uses=1] br i1 %27, label %Brancher4, label %Brancher7 Brancher7: ; preds = %Body6, %Body %28 = load i32* %BranchCounter ; <i32> [#uses=1] %"BrCounter++8" = add i32 %28, 1 ; <i32> [#uses=2] store i32 %"BrCounter++8", i32* %BranchCounter %29 = icmp ult i32 %"BrCounter++8", 10 ; <i1> [#uses=1] br i1 %29, label %Body6, label %Exit } -- Regards, Gabi http://bugspy.net
Eli Friedman
2010-Apr-04 23:08 UTC
[LLVMdev] Code generators (both llvmc and Jit) get stuck when dealing circular CFG
On Sun, Apr 4, 2010 at 3:55 PM, Gabi <bugspynet at gmail.com> wrote:> Hi, > The following arbitrary example makes the code generators to get stuck > (llvmc won't return from command line, Jit won't return from function > call) > Basically it is a CFG with circles, (the function will return by > comparing a branch counter to a threshold on runtime - see the > "Brancher" blocks below) > Any idea what goes wrong? Is it a bug in llvm ?LLVM should never hang; please file a bug (http://llvm.org/docs/HowToSubmitABug.html). -Eli