[llvm-dev] CodeExtractor with phinode

Wehrli Johan via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 27 08:36:58 PDT 2015


Hello,

I try to extact a region from a function with CodeExtractor.

I get the regions with "RegionInfo* RI = &getAnalysis<RegionInfoPass>(*f).getRegionInfo();"

This works quite well except in one case.

When I have a phinode outside the region whose values depend on two basic blocks inside the region.

After the extract, those basic blocks are not in the function anymore.

The last loop in the function “extractCodeRegion" seems to handle this case but the result is strange (2 times the same dependency).

Does anyone know if I have to run another pass before the CodeExtractor or did I miss something?

Cheers,

Johan


**********Example*************

C

int main(int argc, char** argv)/*__attribute__((tp(50)))*/{
bool b1 = true;
bool b2 = false;

if(argc){
bool m = b1 || b2 ;
}
return 0;
}

IR

define i32 @main(i32 %argc, i8** %argv) #0 {
  %.loc = alloca i1
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i8**, align 8
  %b1 = alloca i8, align 1
  %b2 = alloca i8, align 1
  %m = alloca i8, align 1
  store i32 0, i32* %1
  store i32 %argc, i32* %2, align 4
  store i8** %argv, i8*** %3, align 8
  store i8 1, i8* %b1, align 1
  store i8 0, i8* %b2, align 1
  %4 = load i32* %2, align 4
  %5 = icmp ne i32 %4, 0
  br i1 %5, label %codeRepl, label %9

codeRepl:                                         ; preds = %0
  call void @main_(i8* %b1, i8* %b2, i1* %.loc)
  %.reload = load i1* %.loc
  br label %6

; <label>:6                                       ; preds = %codeRepl
  %7 = phi i1 [ true, %codeRepl ], [ %.reload, %codeRepl ]
  %8 = zext i1 %7 to i8
  store i8 %8, i8* %m, align 1
  br label %9

; <label>:9                                       ; preds = %6, %0
  ret i32 0
}


More information about the llvm-dev mailing list