[Openmp-dev] Assertion failed: (!CheckingMode && "CallGraphSCCPass did not update the CallGraph correctly!")

Abid Malik via Openmp-dev openmp-dev at lists.llvm.org
Sun May 9 08:07:59 PDT 2021


Hi,

I am trying to merge  OpenMP for loops. e.g.,



*#pragma omp parallel*

*{*

*        #pragma omp for*

*        for (int i=0; i < 100; i++)*

*                printf("Before--> %d\n", g(i));*



*        #pragma omp for*

*        for (int j=0; j < 10; j++)*

*                printf("After-->%d\n", f(j));*



*        #pragma omp for*

*        for (int i=0; i < 10; i++)*

*                printf("Middle-->%d\n", g(i));*



*        #pragma omp for*

*        for (int i=0; i < 10; i++)*

*                printf("Last-->%d\n", g(i));*



*}*



The last three OpenMP *for loops* can be merged by wrapping them with a
single pair of “call void @__kmpc_for_static_init_4”  and  “call void
@__kmpc_for_static_fini” calls. This will also include some additional
cleaning for redundant store instructions for the registers which become
redundant by merging the loops.



The IR condition before merging



*; Function Attrs: norecurse nounwind ssp uwtable*

*define internal void @.omp_outlined.(i32* noalias %.global_tid., i32*
noalias %.bound_tid.) #1 {*

*entry:*

*  %.omp.lb <http://omp.lb> = alloca i32, align 4*

*  %.omp.ub = alloca i32, align 4*

*  %.omp.stride = alloca i32, align 4*

*  %.omp.is_last = alloca i32, align 4*

*  %.omp.lb6 = alloca i32, align 4*

*  %.omp.ub7 = alloca i32, align 4*

*  %.omp.stride8 = alloca i32, align 4*

*  %.omp.is_last9 = alloca i32, align 4*

*  %.omp.lb30 = alloca i32, align 4*

*  %.omp.ub31 = alloca i32, align 4*

*  %.omp.stride32 = alloca i32, align 4*

*  %.omp.is_last33 = alloca i32, align 4*

*  %.omp.lb55 = alloca i32, align 4*

*  %.omp.ub56 = alloca i32, align 4*

*  %.omp.stride57 = alloca i32, align 4*

*  %.omp.is_last58 = alloca i32, align 4*

*  %0 = bitcast i32* %.omp.lb <http://omp.lb> to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) #5*

*  store i32 0, i32* %.omp.lb <http://omp.lb>, align 4, !tbaa !4*

*  %1 = bitcast i32* %.omp.ub to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %1) #5*

*  store i32 99, i32* %.omp.ub, align 4, !tbaa !4*

*  %2 = bitcast i32* %.omp.stride to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %2) #5*

*  store i32 1, i32* %.omp.stride, align 4, !tbaa !4*

*  %3 = bitcast i32* %.omp.is_last to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %3) #5*

*  store i32 0, i32* %.omp.is_last, align 4, !tbaa !4*

*  %4 = load i32, i32* %.global_tid., align 4, !tbaa !4*

*  call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @0, i32 %4,
i32 34, i32* nonnull %.omp.is_last, i32* nonnull %.omp.lb <http://omp.lb>,
i32* nonnull %.omp.ub, i32* nonnull %.omp.stride, i32 1, i32 1) #5*

*  %5 = load i32, i32* %.omp.ub, align 4, !tbaa !4*

*  %6 = icmp slt i32 %5, 99*

*  %cond = select i1 %6, i32 %5, i32 99*

*  store i32 %cond, i32* %.omp.ub, align 4, !tbaa !4*

*  %7 = load i32, i32* %.omp.lb <http://omp.lb>, align 4, !tbaa !4*

*  br label %omp.inner.for.cond*



*omp.inner.for.cond:                               ; preds =
%omp.inner.for.body, %entry*

*  %.omp.iv.0 = phi i32 [ %7, %entry ], [ %add3, %omp.inner.for.body ]*

*  %8 = load i32, i32* %.omp.ub, align 4, !tbaa !4*

*  %cmp1 = icmp sgt i32 %.omp.iv.0, %8*

*  br i1 %cmp1, label %omp.loop.exit, label %omp.inner.for.body*



*omp.inner.for.body:                               ; preds =
%omp.inner.for.cond*

*  %call2 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1)
getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i64 0, i64 0), i32
%.omp.iv.0)*

*  %add3 = add nsw i32 %.omp.iv.0, 1*

*  br label %omp.inner.for.cond*



*omp.loop.exit:                                    ; preds =
%omp.inner.for.cond*

*  call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @0, i32 %4)
#5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %3) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %2) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %1) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) #5*

*  call void @__kmpc_barrier(%struct.ident_t* nonnull @1, i32 %4) #5*

*  %9 = bitcast i32* %.omp.lb6 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %9) #5*

*  store i32 0, i32* %.omp.lb6, align 4, !tbaa !4*

*  %10 = bitcast i32* %.omp.ub7 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %10) #5*

*  store i32 9, i32* %.omp.ub7, align 4, !tbaa !4*

*  %11 = bitcast i32* %.omp.stride8 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %11) #5*

*  store i32 1, i32* %.omp.stride8, align 4, !tbaa !4*

*  %12 = bitcast i32* %.omp.is_last9 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %12) #5*

*  store i32 0, i32* %.omp.is_last9, align 4, !tbaa !4*

*  call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @0, i32 %4,
i32 34, i32* nonnull %.omp.is_last9, i32* nonnull %.omp.lb6, i32* nonnull
%.omp.ub7, i32* nonnull %.omp.stride8, i32 1, i32 1) #5*

*  %13 = load i32, i32* %.omp.ub7, align 4, !tbaa !4*

*  %14 = icmp slt i32 %13, 9*

*  %cond14 = select i1 %14, i32 %13, i32 9*

*  store i32 %cond14, i32* %.omp.ub7, align 4, !tbaa !4*

*  %15 = load i32, i32* %.omp.lb6, align 4, !tbaa !4*

*  br label %omp.inner.for.cond15*



*omp.inner.for.cond15:                             ; preds =
%omp.inner.for.body18, %omp.loop.exit*

*  %.omp.iv4.0 = phi i32 [ %15, %omp.loop.exit ], [ %add25,
%omp.inner.for.body18 ]*

*  %16 = load i32, i32* %.omp.ub7, align 4, !tbaa !4*

*  %cmp16 = icmp sgt i32 %.omp.iv4.0, %16*

*  br i1 %cmp16, label %omp.loop.exit27, label %omp.inner.for.body18*



*omp.inner.for.body18:                             ; preds =
%omp.inner.for.cond15*

*  %call22 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1)
getelementptr inbounds ([12 x i8], [12 x i8]* @.str.2, i64 0, i64 0), i32
%.omp.iv4.0)*

*  %add25 = add nsw i32 %.omp.iv4.0, 1*

*  br label %omp.inner.for.cond15*



*omp.loop.exit27:                                  ; preds =
%omp.inner.for.cond15*

*  call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @0, i32 %4)
#5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %12) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %11) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %10) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %9) #5*

*  call void @__kmpc_barrier(%struct.ident_t* nonnull @1, i32 %4) #5*

*  %17 = bitcast i32* %.omp.lb30 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %17) #5*

*  store i32 0, i32* %.omp.lb30, align 4, !tbaa !4*

*  %18 = bitcast i32* %.omp.ub31 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %18) #5*

*  store i32 9, i32* %.omp.ub31, align 4, !tbaa !4*

*  %19 = bitcast i32* %.omp.stride32 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %19) #5*

*  store i32 1, i32* %.omp.stride32, align 4, !tbaa !4*

*  %20 = bitcast i32* %.omp.is_last33 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %20) #5*

*  store i32 0, i32* %.omp.is_last33, align 4, !tbaa !4*

*  call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @0, i32 %4,
i32 34, i32* nonnull %.omp.is_last33, i32* nonnull %.omp.lb30, i32* nonnull
%.omp.ub31, i32* nonnull %.omp.stride32, i32 1, i32 1) #5*

*  %21 = load i32, i32* %.omp.ub31, align 4, !tbaa !4*

*  %22 = icmp slt i32 %21, 9*

*  %cond39 = select i1 %22, i32 %21, i32 9*

*  store i32 %cond39, i32* %.omp.ub31, align 4, !tbaa !4*

*  %23 = load i32, i32* %.omp.lb30, align 4, !tbaa !4*

*  br label %omp.inner.for.cond40*



*omp.inner.for.cond40:                             ; preds =
%omp.inner.for.body43, %omp.loop.exit27*

*  %.omp.iv28.0 = phi i32 [ %23, %omp.loop.exit27 ], [ %add50,
%omp.inner.for.body43 ]*

*  %24 = load i32, i32* %.omp.ub31, align 4, !tbaa !4*

*  %cmp41 = icmp sgt i32 %.omp.iv28.0, %24*

*  br i1 %cmp41, label %omp.loop.exit52, label %omp.inner.for.body43*



*omp.inner.for.body43:                             ; preds =
%omp.inner.for.cond40*

*  %call47 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1)
getelementptr inbounds ([13 x i8], [13 x i8]* @.str.3, i64 0, i64 0), i32
%.omp.iv28.0)*

*  %add50 = add nsw i32 %.omp.iv28.0, 1*

*  br label %omp.inner.for.cond40*



*omp.loop.exit52:                                  ; preds =
%omp.inner.for.cond40*

*  call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @0, i32 %4)
#5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %20) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %19) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %18) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %17) #5*

*  call void @__kmpc_barrier(%struct.ident_t* nonnull @1, i32 %4) #5*

*  %25 = bitcast i32* %.omp.lb55 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %25) #5*

*  store i32 0, i32* %.omp.lb55, align 4, !tbaa !4*

*  %26 = bitcast i32* %.omp.ub56 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %26) #5*

*  store i32 9, i32* %.omp.ub56, align 4, !tbaa !4*

*  %27 = bitcast i32* %.omp.stride57 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %27) #5*

*  store i32 1, i32* %.omp.stride57, align 4, !tbaa !4*

*  %28 = bitcast i32* %.omp.is_last58 to i8**

*  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %28) #5*

*  store i32 0, i32* %.omp.is_last58, align 4, !tbaa !4*

*  call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @0, i32 %4,
i32 34, i32* nonnull %.omp.is_last58, i32* nonnull %.omp.lb55, i32* nonnull
%.omp.ub56, i32* nonnull %.omp.stride57, i32 1, i32 1) #5*

*  %29 = load i32, i32* %.omp.ub56, align 4, !tbaa !4*

*  %30 = icmp slt i32 %29, 9*

*  %cond64 = select i1 %30, i32 %29, i32 9*

*  store i32 %cond64, i32* %.omp.ub56, align 4, !tbaa !4*

*  %31 = load i32, i32* %.omp.lb55, align 4, !tbaa !4*

*  br label %omp.inner.for.cond65*



*omp.inner.for.cond65:                             ; preds =
%omp.inner.for.body68, %omp.loop.exit52*

*  %.omp.iv53.0 = phi i32 [ %31, %omp.loop.exit52 ], [ %add75,
%omp.inner.for.body68 ]*

*  %32 = load i32, i32* %.omp.ub56, align 4, !tbaa !4*

*  %cmp66 = icmp sgt i32 %.omp.iv53.0, %32*

*  br i1 %cmp66, label %omp.loop.exit77, label %omp.inner.for.body68*



*omp.inner.for.body68:                             ; preds =
%omp.inner.for.cond65*

*  %call72 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1)
getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i64 0, i64 0), i32
%.omp.iv53.0)*

*  %add75 = add nsw i32 %.omp.iv53.0, 1*

*  br label %omp.inner.for.cond65*



*omp.loop.exit77:                                  ; preds =
%omp.inner.for.cond65*

*  call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @0, i32 %4)
#5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %28) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %27) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %26) #5*

*  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %25) #5*

*  call void @__kmpc_barrier(%struct.ident_t* nonnull @1, i32 %4) #5*

*  ret void*

*}*





 =================>

After merging, I am getting

-----------------

*; Function Attrs: norecurse nounwind ssp uwtable*

*define internal void @.omp_outlined.(i32* noalias %.global_tid., i32*
noalias %.bound_tid.) #1 {*

*entry:*

  *%.omp.lb <http://omp.lb> = alloca i32, align 4*

*  %.omp.ub = alloca i32, align 4*

*  %.omp.stride = alloca i32, align 4*

*  %.omp.is_last = alloca i32, align 4*

*  %.omp.lb6 = alloca i32, align 4*

*  %.omp.ub7 = alloca i32, align 4*

*  %.omp.stride8 = alloca i32, align 4*

*  %.omp.is_last9 = alloca i32, align 4*

*  %.omp.lb30 = alloca i32, align 4*

*  %.omp.ub31 = alloca i32, align 4*

*  %.omp.stride32 = alloca i32, align 4*

*  %.omp.is_last33 = alloca i32, align 4*

*  %.omp.lb55 = alloca i32, align 4*

*  %.omp.ub56 = alloca i32, align 4*

*  %.omp.stride57 = alloca i32, align 4*

*  %.omp.is_last58 = alloca i32, align 4*

*  %0 = bitcast i32* %.omp.lb <http://omp.lb> to i8**

*  store i32 0, i32* %.omp.lb <http://omp.lb>, align 4, !tbaa !4*

*  %1 = bitcast i32* %.omp.ub to i8**

*  store i32 99, i32* %.omp.ub, align 4, !tbaa !4*

*  %2 = bitcast i32* %.omp.stride to i8**

*  store i32 1, i32* %.omp.stride, align 4, !tbaa !4*

*  %3 = bitcast i32* %.omp.is_last to i8**

*  store i32 0, i32* %.omp.is_last, align 4, !tbaa !4*

*  %4 = load i32, i32* %.global_tid., align 4, !tbaa !4*

*  call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @0, i32 %4,
i32 34, i32* nonnull %.omp.is_last, i32* nonnull %.omp.lb <http://omp.lb>,
i32* nonnull %.omp.ub, i32* nonnull %.omp.stride, i32 1, i32 1) #5*

*  %5 = load i32, i32* %.omp.ub, align 4, !tbaa !4*

*  %6 = icmp slt i32 %5, 99*

*  %cond = select i1 %6, i32 %5, i32 99*

*  store i32 %cond, i32* %.omp.ub, align 4, !tbaa !4*

*  %7 = load i32, i32* %.omp.lb <http://omp.lb>, align 4, !tbaa !4*

*  br label %omp.inner.for.cond*



*omp.inner.for.cond:                               ; preds =
%omp.inner.for.body, %entry*

*  %.omp.iv.0 = phi i32 [ %7, %entry ], [ %add3, %omp.inner.for.body ]*

*  %8 = load i32, i32* %.omp.ub, align 4, !tbaa !4*

*  %cmp1 = icmp sgt i32 %.omp.iv.0, %8*

*  br i1 %cmp1, label %omp.loop.exit, label %omp.inner.for.body*



*omp.inner.for.body:                               ; preds =
%omp.inner.for.cond*

*  %call2 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1)
getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i64 0, i64 0), i32
%.omp.iv.0)*

*  %add3 = add nsw i32 %.omp.iv.0, 1*

*  br label %omp.inner.for.cond*



*omp.loop.exit:                                    ; preds =
%omp.inner.for.cond*

*  call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @0, i32 %4)
#5*

*  call void @__kmpc_barrier(%struct.ident_t* nonnull @1, i32 %4) #5*

*  %9 = bitcast i32* %.omp.lb6 to i8**

*  store i32 0, i32* %.omp.lb6, align 4, !tbaa !4*

*  %10 = bitcast i32* %.omp.ub7 to i8**

*  store i32 9, i32* %.omp.ub7, align 4, !tbaa !4*

*  %11 = bitcast i32* %.omp.stride8 to i8**

*  store i32 1, i32* %.omp.stride8, align 4, !tbaa !4*

*  %12 = bitcast i32* %.omp.is_last9 to i8**

*  store i32 0, i32* %.omp.is_last9, align 4, !tbaa !4*

*  call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @0, i32 %4,
i32 34, i32* nonnull %.omp.is_last9, i32* nonnull %.omp.lb6, i32* nonnull
%.omp.ub7, i32* nonnull %.omp.stride8, i32 1, i32 1) #5*

*  %13 = load i32, i32* %.omp.ub7, align 4, !tbaa !4*

*  %14 = icmp slt i32 %13, 9*

*  %cond14 = select i1 %14, i32 %13, i32 9*

*  store i32 %cond14, i32* %.omp.ub7, align 4, !tbaa !4*

*  %15 = load i32, i32* %.omp.lb6, align 4, !tbaa !4*

*  br label %omp.inner.for.cond15*



*omp.inner.for.cond15:                             ; preds =
%omp.inner.for.body18, %omp.loop.exit*

*  %.omp.iv4.0 = phi i32 [ %15, %omp.loop.exit ], [ %add25,
%omp.inner.for.body18 ]*

*  %16 = load i32, i32* %.omp.ub7, align 4, !tbaa !4*

*  %cmp16 = icmp sgt i32 %.omp.iv4.0, %16*

*  br i1 %cmp16, label %omp.loop.exit27, label %omp.inner.for.body18*



*omp.inner.for.body18:                             ; preds =
%omp.inner.for.cond15*

*  %call22 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1)
getelementptr inbounds ([12 x i8], [12 x i8]* @.str.2, i64 0, i64 0), i32
%.omp.iv4.0)*

*  %add25 = add nsw i32 %.omp.iv4.0, 1*

*  br label %omp.inner.for.cond15*



*omp.loop.exit27:                                  ; preds =
%omp.inner.for.cond15*

*  call void @__kmpc_barrier(%struct.ident_t* nonnull @1, i32 %4) #5*

*  %17 = bitcast i32* %.omp.lb6 to i8**

*  %18 = bitcast i32* %.omp.ub7 to i8**

*  %19 = bitcast i32* %.omp.stride8 to i8**

*  %20 = bitcast i32* %.omp.is_last9 to i8**

*  %21 = load i32, i32* %.omp.ub7, align 4, !tbaa !4*

*  %22 = icmp slt i32 %21, 9*

*  %cond39 = select i1 %22, i32 %21, i32 9*

*  %23 = load i32, i32* %.omp.lb6, align 4, !tbaa !4*

*  br label %omp.inner.for.cond40*



*omp.inner.for.cond40:                             ; preds =
%omp.inner.for.body43, %omp.loop.exit27*

*  %.omp.iv28.0 = phi i32 [ %23, %omp.loop.exit27 ], [ %add50,
%omp.inner.for.body43 ]*

*  %24 = load i32, i32* %.omp.ub7, align 4, !tbaa !4*

*  %cmp41 = icmp sgt i32 %.omp.iv28.0, %24*

*  br i1 %cmp41, label %omp.loop.exit52, label %omp.inner.for.body43*



*omp.inner.for.body43:                             ; preds =
%omp.inner.for.cond40*

*  %call47 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1)
getelementptr inbounds ([13 x i8], [13 x i8]* @.str.3, i64 0, i64 0), i32
%.omp.iv28.0)*

*  %add50 = add nsw i32 %.omp.iv28.0, 1*

*  br label %omp.inner.for.cond40*



*omp.loop.exit52:                                  ; preds =
%omp.inner.for.cond40*

*  call void @__kmpc_barrier(%struct.ident_t* nonnull @1, i32 %4) #5*

*  %25 = bitcast i32* %.omp.lb6 to i8**

*  %26 = bitcast i32* %.omp.ub7 to i8**

*  %27 = bitcast i32* %.omp.stride8 to i8**

*  %28 = bitcast i32* %.omp.is_last9 to i8**

*  %29 = load i32, i32* %.omp.ub7, align 4, !tbaa !4*

*  %30 = icmp slt i32 %29, 9*

*  %cond64 = select i1 %30, i32 %29, i32 9*

*  %31 = load i32, i32* %.omp.lb6, align 4, !tbaa !4*

*  br label %omp.inner.for.cond65*



*omp.inner.for.cond65:                             ; preds =
%omp.inner.for.body68, %omp.loop.exit52*

*  %.omp.iv53.0 = phi i32 [ %31, %omp.loop.exit52 ], [ %add75,
%omp.inner.for.body68 ]*

*  %32 = load i32, i32* %.omp.ub7, align 4, !tbaa !4*

*  %cmp66 = icmp sgt i32 %.omp.iv53.0, %32*

*  br i1 %cmp66, label %omp.loop.exit77, label %omp.inner.for.body68*



*omp.inner.for.body68:                             ; preds =
%omp.inner.for.cond65*

*  %call72 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1)
getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i64 0, i64 0), i32
%.omp.iv53.0)*

*  %add75 = add nsw i32 %.omp.iv53.0, 1*

*  br label %omp.inner.for.cond65*



*omp.loop.exit77:                                  ; preds =
%omp.inner.for.cond65*

*  call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @0, i32 %4)
#5*

*  call void @__kmpc_barrier(%struct.ident_t* nonnull @1, i32 %4) #5*

*  ret void*

*}*



 --------->

I checked manually each instruction. It should run. However, I am getting
the following error when I tried to compile



clang -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk
-O3 -fopenmp test2.c



I getting the following error:



*Assertion failed: (!CheckingMode && "CallGraphSCCPass did not update the
CallGraph correctly!"), function RefreshCallGraph, file
/Users/abidmalik/Programming/LLVM_11/llvm-project/llvm/lib/Analysis/CallGraphSCCPass.cpp,
line 279.*





I had a patch under consideration (https://reviews.llvm.org/D90103/new/ ) (
I am improving it)  which works fine with the same example. I checked the
out and it is the same as the one mentioned above. This is the confusing
part for me.


( Apology for the long e-mail)
-- 
Abid M. Malik
******************************************************
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/openmp-dev/attachments/20210509/eff614da/attachment-0001.html>


More information about the Openmp-dev mailing list