120 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='simple-loop-unswitch<nontrivial>' -S < %s | FileCheck %s3 4; If we try to replace uses of `true` outside of `@foo`, we'll see it here.5define i1 @bar() {6; CHECK-LABEL: @bar(7; CHECK-NEXT: ret i1 true8;9 ret i1 true10}11 12; We shouldn't unswitch this loop.13define void @foo() {14; CHECK-LABEL: @foo(15; CHECK-NEXT: entry:16; CHECK-NEXT: br label [[HEADER:%.*]]17; CHECK: header:18; CHECK-NEXT: [[VAL:%.*]] = select i1 true, i1 true, i1 false19; CHECK-NEXT: br i1 [[VAL]], label [[EXIT:%.*]], label [[HEADER]]20; CHECK: exit:21; CHECK-NEXT: ret void22;23entry:24 br label %header25 26header:27 %val = select i1 true, i1 true, i1 false28 br i1 %val, label %exit, label %header29 30exit:31 ret void32}33 34define void @unswitch_trivial_select(i1 %c.1, i1 %c.2, i8 %a) {35; CHECK-LABEL: @unswitch_trivial_select(36; CHECK-NEXT: entry:37; CHECK-NEXT: br i1 [[C_1:%.*]], label [[PH_1:%.*]], label [[EXIT:%.*]]38; CHECK: ph.1:39; CHECK-NEXT: br i1 [[C_2:%.*]], label [[PH_2:%.*]], label [[EXIT]]40; CHECK: ph.2:41; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 3042; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i1 true, i1 false43; CHECK-NEXT: [[CMP_FR:%.*]] = freeze i1 [[CMP]]44; CHECK-NEXT: br i1 [[CMP_FR]], label [[PH_2_SPLIT_US:%.*]], label [[PH_2_SPLIT:%.*]]45; CHECK: ph.2.split.us:46; CHECK-NEXT: br label [[LOOP_US:%.*]]47; CHECK: loop.us:48; CHECK-NEXT: call void @foo()49; CHECK-NEXT: br label [[EXIT_LOOPEXIT_SPLIT_US:%.*]]50; CHECK: exit.loopexit.split.us:51; CHECK-NEXT: br label [[EXIT_LOOPEXIT:%.*]]52; CHECK: ph.2.split:53; CHECK-NEXT: br label [[LOOP:%.*]]54; CHECK: loop:55; CHECK-NEXT: call void @foo()56; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]57; CHECK: loop.latch:58; CHECK-NEXT: br label [[LOOP]]59; CHECK: exit.loopexit:60; CHECK-NEXT: br label [[EXIT]]61; CHECK: exit:62; CHECK-NEXT: ret void63;64entry:65 br i1 %c.1, label %ph.1, label %exit66 67ph.1:68 br i1 %c.2, label %ph.2, label %exit69 70ph.2:71 %cmp = icmp eq i8 %a, 3072 %sel = select i1 %cmp, i1 true, i1 false73 br label %loop74 75loop:76 call void @foo()77 br i1 %sel, label %exit, label %loop.latch78 79loop.latch:80 br label %loop81 82exit:83 ret void84}85 86; Test case for PR55697.87define i32 @unswitch_trivial_select_cmp_outside(i32 %x) {88; CHECK-LABEL: @unswitch_trivial_select_cmp_outside(89; CHECK-NEXT: entry:90; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], 10091; CHECK-NEXT: br i1 [[C]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]92; CHECK: entry.split.us:93; CHECK-NEXT: br label [[LOOP_US:%.*]]94; CHECK: loop.us:95; CHECK-NEXT: [[P_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ 35, [[LOOP_US]] ]96; CHECK-NEXT: br label [[LOOP_US]]97; CHECK: entry.split:98; CHECK-NEXT: br label [[LOOP:%.*]]99; CHECK: loop:100; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ]101; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 false, i1 true, i1 false102; CHECK-NEXT: br label [[EXIT:%.*]]103; CHECK: exit:104; CHECK-NEXT: [[LCSSA:%.*]] = phi i32 [ [[P]], [[LOOP]] ]105; CHECK-NEXT: ret i32 [[LCSSA]]106;107entry:108 %c = icmp ult i32 %x, 100109 br label %loop110 111loop:112 %p = phi i32 [ 0, %entry ], [ 35, %loop ]113 %spec.select = select i1 %c, i1 true, i1 false114 br i1 %spec.select, label %loop, label %exit115 116exit:117 %lcssa = phi i32 [ %p, %loop ]118 ret i32 %lcssa119}120