CodeExtractor with phinode

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
}

Hi Johan,

Did you able to resolve the below issue ?

Community , Any inputs here ?

Thank you
~Umesh