| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 |
| ; RUN: opt < %s -passes='print<scalar-evolution>,simple-loop-unswitch<nontrivial>' -verify-scev -S | FileCheck %s |
| |
| ; This is a reproducer for https://github.com/llvm/llvm-project/issues/61080 |
| ; |
| ; Note that the print<scalar-evolution> in the beginning of the pipeline is |
| ; needed for reproducing the original problem, as we need something that |
| ; calculate SCEV before the loop unswitch, to verify that we invalidate SCEV |
| ; correctly while doing the unswitch. |
| ; |
| ; Verify that we no longer hit that assert. Also perform checks to show the IR |
| ; transformation that is going on in this test. |
| |
| |
| define i32 @foo(i1 %not) { |
| ; CHECK-LABEL: define i32 @foo |
| ; CHECK-SAME: (i1 [[NOT:%.*]]) { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[FALSE:%.*]] = and i1 true, false |
| ; CHECK-NEXT: br i1 [[NOT]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] |
| ; CHECK: entry.split.us: |
| ; CHECK-NEXT: br i1 [[FALSE]], label [[ENTRY_SPLIT_US_SPLIT_US:%.*]], label [[ENTRY_SPLIT_US_SPLIT:%.*]] |
| ; CHECK: entry.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND_US_US:%.*]] |
| ; CHECK: for.cond.us.us: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_US_US:%.*]] |
| ; CHECK: for.cond.split.us.us.us: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: for.cond.split.us.split.us.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: entry.split.us.split: |
| ; CHECK-NEXT: br label [[FOR_COND_US:%.*]] |
| ; CHECK: for.cond.us: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_US:%.*]] |
| ; CHECK: for.inc11.us: |
| ; CHECK-NEXT: br label [[FOR_COND_US]] |
| ; CHECK: for.cond.split.us.us: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_SPLIT_US11:%.*]] |
| ; CHECK: for.cond5.preheader.us.us9: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_US_US10:%.*]] |
| ; CHECK: for.inc8.us.us: |
| ; CHECK-NEXT: br i1 false, label [[FOR_INC8_FOR_COND5_PREHEADER_CRIT_EDGE_US_US:%.*]], label [[FOR_INC11_SPLIT_US_US:%.*]] |
| ; CHECK: for.inc8.for.cond5.preheader_crit_edge.us.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_US_US9:%.*]] |
| ; CHECK: for.end.us.us: |
| ; CHECK-NEXT: br i1 false, label [[FOR_INC8_US_US:%.*]], label [[CLEANUP15_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: for.cond5.preheader.split.us.us.us10: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_SPLIT_US7_US:%.*]] |
| ; CHECK: for.body7.us.us4.us: |
| ; CHECK-NEXT: br label [[HANDLER_POINTER_OVERFLOW_US_US5_US:%.*]] |
| ; CHECK: handler.pointer_overflow.us.us5.us: |
| ; CHECK-NEXT: br label [[CONT_US_US6_US:%.*]] |
| ; CHECK: cont.us.us6.us: |
| ; CHECK-NEXT: br label [[FOR_END_SPLIT_US_US_US:%.*]] |
| ; CHECK: for.end.split.us.us.us: |
| ; CHECK-NEXT: br label [[FOR_END_US_US:%.*]] |
| ; CHECK: for.cond5.preheader.split.us.split.us7.us: |
| ; CHECK-NEXT: br label [[FOR_BODY7_US_US4_US:%.*]] |
| ; CHECK: for.inc11.split.us.us: |
| ; CHECK-NEXT: br label [[FOR_INC11_US:%.*]] |
| ; CHECK: for.cond.split.us.split.us11: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_US_US9]] |
| ; CHECK: for.cond.split.us.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: cleanup15.split.us.split.us: |
| ; CHECK-NEXT: br label [[CLEANUP15_SPLIT_US:%.*]] |
| ; CHECK: entry.split: |
| ; CHECK-NEXT: br i1 [[FALSE]], label [[ENTRY_SPLIT_SPLIT_US:%.*]], label [[ENTRY_SPLIT_SPLIT:%.*]] |
| ; CHECK: entry.split.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND_US12:%.*]] |
| ; CHECK: for.cond.us12: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_US:%.*]] |
| ; CHECK: for.cond.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: for.cond.split.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_SPLIT_US:%.*]] |
| ; CHECK: entry.split.split: |
| ; CHECK-NEXT: br label [[FOR_COND:%.*]] |
| ; CHECK: for.cond: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT:%.*]] |
| ; CHECK: for.cond.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_US_US:%.*]] |
| ; CHECK: for.cond5.preheader.us.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_US_US:%.*]] |
| ; CHECK: for.cond5.preheader.split.us.us.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: for.cond5.preheader.split.us.split.us.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: cleanup15.split.us: |
| ; CHECK-NEXT: br label [[CLEANUP15:%.*]] |
| ; CHECK: for.cond5.preheader.split.us.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: for.cond.split: |
| ; CHECK-NEXT: br label [[FOR_COND_SPLIT_SPLIT:%.*]] |
| ; CHECK: for.cond.split.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_US8:%.*]] |
| ; CHECK: for.cond5.preheader.us8: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_US:%.*]] |
| ; CHECK: for.cond5.preheader.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_SPLIT_US_SPLIT_US:%.*]] |
| ; CHECK: for.cond5.preheader.split.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_SPLIT_US:%.*]] |
| ; CHECK: for.cond.split.split: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER:%.*]] |
| ; CHECK: for.cond5.preheader: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT:%.*]] |
| ; CHECK: for.cond5.preheader.split.us.split.us: |
| ; CHECK-NEXT: br label [[FOR_BODY7_US_US:%.*]] |
| ; CHECK: for.body7.us.us: |
| ; CHECK-NEXT: br label [[HANDLER_POINTER_OVERFLOW_US_US:%.*]] |
| ; CHECK: handler.pointer_overflow.us.us: |
| ; CHECK-NEXT: br label [[CONT_US_US:%.*]] |
| ; CHECK: cont.us.us: |
| ; CHECK-NEXT: br label [[CONT_FOR_BODY7_CRIT_EDGE_US_US:%.*]] |
| ; CHECK: cont.for.body7_crit_edge.us.us: |
| ; CHECK-NEXT: br label [[FOR_BODY7_US_US]] |
| ; CHECK: for.cond5.preheader.split: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER_SPLIT_SPLIT:%.*]] |
| ; CHECK: for.cond5.preheader.split.split.us: |
| ; CHECK-NEXT: br label [[FOR_BODY7_US1:%.*]] |
| ; CHECK: for.body7.us1: |
| ; CHECK-NEXT: br label [[CONT_US2:%.*]] |
| ; CHECK: cont.us2: |
| ; CHECK-NEXT: br label [[CONT_FOR_BODY7_CRIT_EDGE_US3:%.*]] |
| ; CHECK: cont.for.body7_crit_edge.us3: |
| ; CHECK-NEXT: br label [[FOR_BODY7_US1]] |
| ; CHECK: for.cond5.preheader.split.split: |
| ; CHECK-NEXT: br label [[FOR_BODY7:%.*]] |
| ; CHECK: for.body7: |
| ; CHECK-NEXT: br label [[CONT:%.*]] |
| ; CHECK: cont: |
| ; CHECK-NEXT: br label [[FOR_END_SPLIT:%.*]] |
| ; CHECK: for.end.split: |
| ; CHECK-NEXT: br label [[FOR_END:%.*]] |
| ; CHECK: for.end: |
| ; CHECK-NEXT: br i1 false, label [[FOR_INC8:%.*]], label [[CLEANUP15_SPLIT:%.*]] |
| ; CHECK: for.inc8: |
| ; CHECK-NEXT: br i1 false, label [[FOR_INC8_FOR_COND5_PREHEADER_CRIT_EDGE:%.*]], label [[FOR_INC11_SPLIT:%.*]] |
| ; CHECK: for.inc8.for.cond5.preheader_crit_edge: |
| ; CHECK-NEXT: br label [[FOR_COND5_PREHEADER]] |
| ; CHECK: for.inc11.split: |
| ; CHECK-NEXT: br label [[FOR_INC11:%.*]] |
| ; CHECK: for.inc11: |
| ; CHECK-NEXT: br label [[FOR_COND]] |
| ; CHECK: cleanup15.split: |
| ; CHECK-NEXT: br label [[CLEANUP15]] |
| ; CHECK: cleanup15: |
| ; CHECK-NEXT: ret i32 0 |
| ; |
| entry: |
| %false = and i1 1, 0 |
| br label %for.cond |
| |
| for.cond: ; preds = %for.inc11, %entry |
| br label %for.cond5.preheader |
| |
| for.cond5.preheader: ; preds = %for.inc8.for.cond5.preheader_crit_edge, %for.cond |
| br label %for.body7 |
| |
| for.body7: ; preds = %cont.for.body7_crit_edge, %for.cond5.preheader |
| br i1 %not, label %handler.pointer_overflow, label %cont |
| |
| handler.pointer_overflow: ; preds = %for.body7 |
| br label %cont |
| |
| cont: ; preds = %handler.pointer_overflow, %for.body7 |
| br i1 %false, label %cont.for.body7_crit_edge, label %for.end |
| |
| cont.for.body7_crit_edge: ; preds = %cont |
| br label %for.body7 |
| |
| for.end: ; preds = %cont |
| br i1 %false, label %for.inc8, label %cleanup15 |
| |
| for.inc8: ; preds = %for.end |
| br i1 %false, label %for.inc8.for.cond5.preheader_crit_edge, label %for.inc11 |
| |
| for.inc8.for.cond5.preheader_crit_edge: ; preds = %for.inc8 |
| br label %for.cond5.preheader |
| |
| for.inc11: ; preds = %for.inc8 |
| br label %for.cond |
| |
| cleanup15: ; preds = %for.end |
| ret i32 0 |
| } |