1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -loop-reduce -S < %s | FileCheck %s 3; 4; Test LSR's use of SplitCriticalEdge during phi rewriting. 5 6target triple = "x86_64-apple-darwin" 7 8; Provide legal integer types. 9target datalayout = "n8:16:32:64" 10 11; Verify that identical edges are merged. rdar://problem/6453893 12 13define i8* @test1() { 14; 15; CHECK-LABEL: @test1( 16; CHECK-NEXT: entry: 17; CHECK-NEXT: br label [[LOOP:%.*]] 18; CHECK: loop: 19; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP:%.*]], [[LOOP]] ], [ null, [[ENTRY:%.*]] ] 20; CHECK-NEXT: [[SCEVGEP]] = getelementptr i8, i8* [[LSR_IV]], i64 1 21; CHECK-NEXT: br i1 false, label [[LOOP]], label [[LOOPEXIT:%.*]] 22; CHECK: loopexit: 23; CHECK-NEXT: br i1 false, label [[BBA:%.*]], label [[BBB:%.*]] 24; CHECK: bbA: 25; CHECK-NEXT: switch i32 0, label [[BBA_BB89_CRIT_EDGE:%.*]] [ 26; CHECK-NEXT: i32 47, label [[BBA_BB89_CRIT_EDGE]] 27; CHECK-NEXT: i32 58, label [[BBA_BB89_CRIT_EDGE]] 28; CHECK-NEXT: ] 29; CHECK: bbA.bb89_crit_edge: 30; CHECK-NEXT: br label [[BB89:%.*]] 31; CHECK: bbB: 32; CHECK-NEXT: switch i8 0, label [[BBB_BB89_CRIT_EDGE:%.*]] [ 33; CHECK-NEXT: i8 47, label [[BBB_BB89_CRIT_EDGE]] 34; CHECK-NEXT: i8 58, label [[BBB_BB89_CRIT_EDGE]] 35; CHECK-NEXT: ] 36; CHECK: bbB.bb89_crit_edge: 37; CHECK-NEXT: br label [[BB89]] 38; CHECK: bb89: 39; CHECK-NEXT: [[TMP75PHI:%.*]] = phi i8* [ [[SCEVGEP]], [[BBA_BB89_CRIT_EDGE]] ], [ [[SCEVGEP]], [[BBB_BB89_CRIT_EDGE]] ] 40; CHECK-NEXT: br label [[EXIT:%.*]] 41; CHECK: exit: 42; CHECK-NEXT: ret i8* [[TMP75PHI]] 43; 44entry: 45 br label %loop 46 47loop: 48 %rec = phi i32 [ %next, %loop ], [ 0, %entry ] 49 %next = add i32 %rec, 1 50 %tmp75 = getelementptr i8, i8* null, i32 %next 51 br i1 false, label %loop, label %loopexit 52 53loopexit: 54 br i1 false, label %bbA, label %bbB 55 56bbA: 57 switch i32 0, label %bb89 [ 58 i32 47, label %bb89 59 i32 58, label %bb89 60 ] 61 62bbB: 63 switch i8 0, label %bb89 [ 64 i8 47, label %bb89 65 i8 58, label %bb89 66 ] 67 68bb89: 69 %tmp75phi = phi i8* [ %tmp75, %bbA ], [ %tmp75, %bbA ], [ %tmp75, %bbA ], [ %tmp75, %bbB ], [ %tmp75, %bbB ], [ %tmp75, %bbB ] 70 br label %exit 71 72exit: 73 ret i8* %tmp75phi 74} 75 76; Handle single-predecessor phis: PR13756 77define i8* @test2() { 78; 79; CHECK-LABEL: @test2( 80; CHECK-NEXT: entry: 81; CHECK-NEXT: br label [[LOOP:%.*]] 82; CHECK: loop: 83; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP:%.*]], [[LOOP]] ], [ null, [[ENTRY:%.*]] ] 84; CHECK-NEXT: [[SCEVGEP]] = getelementptr i8, i8* [[LSR_IV]], i64 1 85; CHECK-NEXT: br i1 false, label [[LOOP]], label [[LOOPEXIT:%.*]] 86; CHECK: loopexit: 87; CHECK-NEXT: br i1 false, label [[BBA:%.*]], label [[BBB:%.*]] 88; CHECK: bbA: 89; CHECK-NEXT: switch i32 0, label [[BB89:%.*]] [ 90; CHECK-NEXT: i32 47, label [[BB89]] 91; CHECK-NEXT: i32 58, label [[BB89]] 92; CHECK-NEXT: ] 93; CHECK: bbB: 94; CHECK-NEXT: switch i8 0, label [[BBB_EXIT_CRIT_EDGE:%.*]] [ 95; CHECK-NEXT: i8 47, label [[BBB_EXIT_CRIT_EDGE]] 96; CHECK-NEXT: i8 58, label [[BBB_EXIT_CRIT_EDGE]] 97; CHECK-NEXT: ] 98; CHECK: bbB.exit_crit_edge: 99; CHECK-NEXT: br label [[EXIT:%.*]] 100; CHECK: bb89: 101; CHECK-NEXT: [[TMP75PHI:%.*]] = phi i8* [ [[SCEVGEP]], [[BBA]] ], [ [[SCEVGEP]], [[BBA]] ], [ [[SCEVGEP]], [[BBA]] ] 102; CHECK-NEXT: br label [[EXIT]] 103; CHECK: exit: 104; CHECK-NEXT: [[RESULT:%.*]] = phi i8* [ [[TMP75PHI]], [[BB89]] ], [ [[SCEVGEP]], [[BBB_EXIT_CRIT_EDGE]] ] 105; CHECK-NEXT: ret i8* [[RESULT]] 106; 107entry: 108 br label %loop 109 110loop: 111 %rec = phi i32 [ %next, %loop ], [ 0, %entry ] 112 %next = add i32 %rec, 1 113 %tmp75 = getelementptr i8, i8* null, i32 %next 114 br i1 false, label %loop, label %loopexit 115 116loopexit: 117 br i1 false, label %bbA, label %bbB 118 119bbA: 120 switch i32 0, label %bb89 [ 121 i32 47, label %bb89 122 i32 58, label %bb89 123 ] 124 125bbB: 126 switch i8 0, label %exit [ 127 i8 47, label %exit 128 i8 58, label %exit 129 ] 130 131bb89: 132 %tmp75phi = phi i8* [ %tmp75, %bbA ], [ %tmp75, %bbA ], [ %tmp75, %bbA ] 133 br label %exit 134 135exit: 136 %result = phi i8* [ %tmp75phi, %bb89 ], [ %tmp75, %bbB ], [ %tmp75, %bbB ], [ %tmp75, %bbB ] 137 ret i8* %result 138} 139