51 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; REQUIRES: asserts3; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes='require<domtree>,loop(loop-simplifycfg)' -debug-only=loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa 2>&1 < %s | FileCheck %s4; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes=loop-simplifycfg -verify-memoryssa -debug-only=loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa 2>&1 < %s | FileCheck %s5 6target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1"7 8; This test has irreducible CFG, and RPO may be the following:9; Header, Dead, Irreducible2, Latch, Irreducible3, Irreducible1.10; As result, we will process Irreducible2 before its predecessor Irreducible1.11; The current algorithm gets confused in this case. We may support irreducible12; CFG in the future.13define void @irreducible_cfg(i1 %cond) {14; CHECK-LABEL: @irreducible_cfg(15; CHECK-NEXT: entry:16; CHECK-NEXT: br label [[HEADER:%.*]]17; CHECK: header:18; CHECK-NEXT: br i1 false, label [[DEAD:%.*]], label [[IRREDUCIBLE1:%.*]]19; CHECK: dead:20; CHECK-NEXT: br label [[IRREDUCIBLE2:%.*]]21; CHECK: irreducible2:22; CHECK-NEXT: br i1 [[COND:%.*]], label [[LATCH:%.*]], label [[IRREDUCIBLE3:%.*]]23; CHECK: latch:24; CHECK-NEXT: br label [[HEADER]]25; CHECK: irreducible3:26; CHECK-NEXT: br label [[IRREDUCIBLE1]]27; CHECK: irreducible1:28; CHECK-NEXT: br label [[IRREDUCIBLE2]]29;30entry:31 br label %header32 33header: ; preds = %latch, %entry34 br i1 false, label %dead, label %irreducible135 36dead: ; preds = %header37 br label %irreducible238 39irreducible2: ; preds = %irreducible1, %dead40 br i1 %cond, label %latch, label %irreducible341 42latch: ; preds = %irreducible243 br label %header44 45irreducible3: ; preds = %irreducible246 br label %irreducible147 48irreducible1: ; preds = %irreducible3, %header49 br label %irreducible250}51