brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 391f0ec Raw
104 lines · plain
1; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s2; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s 2>&1 | FileCheck %s --check-prefix=IR3;4; The SCoP contains a loop with multiple exit blocks (BBs after leaving5; the loop). The current implementation of deriving their domain derives6; only a common domain for all of the exit blocks. We disabled loops with7; multiple exit blocks until this is fixed.8; XFAIL: *9;10; Check that we do not crash and generate valid IR.11;12; CHECK:      Assumed Context:13; CHECK-NEXT:   [count1, dobreak, count2] -> {  :  }14; CHECK-NEXT: Invalid Context:15; CHECK-NEXT:   [count1, dobreak, count2] -> {  : (count1 > 0 and dobreak > 0) or count1 <= 0 or (count1 > 0 and dobreak <= 0 and count2 > 0) }16;17; CHECK:      Stmt_loop_enter18; CHECK-NEXT:     Domain :=19; CHECK-NEXT:         [count1, dobreak, count2] -> { Stmt_loop_enter[] : count1 > 0 };20 21; CHECK:      Stmt_loop_break22; CHECK-NEXT:     Domain :=23; CHECK-NEXT:         [count1, dobreak, count2] -> { Stmt_loop_break[] : count1 > 0 and dobreak > 0 };24 25; CHECK:      Stmt_loop_finish26; CHECK-NEXT:     Domain :=27; CHECK-NEXT:         [count1, dobreak, count2] -> { Stmt_loop_finish[] : count1 > 0 and dobreak <= 0 and count2 > 0 };28 29; CHECK:      Stmt_loop_skip30; CHECK-NEXT:     Domain :=31; CHECK-NEXT:         [count1, dobreak, count2] -> { Stmt_loop_skip[] : count1 <= 0 };32 33; IR:      polly.merge_new_and_old:34; IR-NEXT:   %phi.ph.merge = phi float [ %phi.ph.final_reload, %polly.exiting ], [ %phi.ph, %return.region_exiting ]35; IR-NEXT:   br label %return36;37; IR:      return:38; IR-NEXT:   %phi = phi float [ %phi.ph.merge, %polly.merge_new_and_old ]39 40declare void @g();41 42define void @func(i64 %count1, i64 %count2, i32 %dobreak, ptr %A) {43entry:44  %fadd = fadd float undef, undef45  br label %loopguard46 47loopguard:48  %cmp6 = icmp sgt i64 %count1, 049  br i1 %cmp6, label %loop_enter, label %loop_skip50 51 52loop_enter:53  store float 1.0, ptr %A54  br label %loop_header55 56loop_header:57  %indvars.iv63 = phi i64 [ %indvars.iv.next64, %loop_continue ], [ 0, %loop_enter ]58  %indvars.iv.next64 = add nuw nsw i64 %indvars.iv63, 159  %add8 = add i64 undef, undef60  %cmp_break = icmp sge i32 %dobreak, 161  br i1 %cmp_break, label %loop_break, label %loop_continue62 63loop_continue:64  %cmp9 = icmp eq i64 %indvars.iv.next64, %count265  br i1 %cmp9, label %loop_finish, label %loop_header66 67 68loop_break:69  store float 2.0, ptr %A70  br label %loop_break_error71 72loop_break_error:73  %cmp_loop_break = fcmp oeq float %fadd, 2.74  br i1 %cmp_loop_break, label %loop_break_g, label %return75 76loop_break_g:77  call void @g()78  br label %return79 80 81loop_finish:82    store float 3.0, ptr %A83  br label %loop_finish_error84 85loop_finish_error:86  call void @g()87  br label %return88 89 90loop_skip:91  store float 4.0, ptr %A92  br label %loop_skip_error93 94loop_skip_error:95  call void @g()96  br label %return97 98 99return:100  %phi = phi float [ 0.0, %loop_finish_error ], [ 0.0, %loop_break_error ], [ 2.0, %loop_break_g ], [ 3.0, %loop_skip_error ]101  store float 1.0, ptr %A102  ret void103}104