Andrew Trick | 8de329a | 2011-10-04 03:50:44 +0000 | [diff] [blame] | 1 | ; RUN: opt -loop-reduce -S < %s | FileCheck %s |
| 2 | ; |
| 3 | ; Test LSR's use of SplitCriticalEdge during phi rewriting. |
Andrew Trick | 8de329a | 2011-10-04 03:50:44 +0000 | [diff] [blame] | 4 | |
| 5 | target triple = "x86-apple-darwin" |
| 6 | |
Mehdi Amini | 46a4355 | 2015-03-04 18:43:29 +0000 | [diff] [blame] | 7 | ; Provide legal integer types. |
| 8 | target datalayout = "n8:16:32:64" |
| 9 | |
| 10 | |
Andrew Trick | 402edbb | 2012-09-18 17:51:33 +0000 | [diff] [blame] | 11 | ; Verify that identical edges are merged. rdar://problem/6453893 |
Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 12 | ; CHECK-LABEL: @test1( |
Andrew Trick | 8de329a | 2011-10-04 03:50:44 +0000 | [diff] [blame] | 13 | ; CHECK: bb89: |
| 14 | ; CHECK: phi i8* [ %lsr.iv.next1, %bbA.bb89_crit_edge ], [ %lsr.iv.next1, %bbB.bb89_crit_edge ]{{$}} |
| 15 | |
Andrew Trick | 402edbb | 2012-09-18 17:51:33 +0000 | [diff] [blame] | 16 | define i8* @test1() { |
Andrew Trick | 8de329a | 2011-10-04 03:50:44 +0000 | [diff] [blame] | 17 | entry: |
| 18 | br label %loop |
| 19 | |
| 20 | loop: |
| 21 | %rec = phi i32 [ %next, %loop ], [ 0, %entry ] |
| 22 | %next = add i32 %rec, 1 |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 23 | %tmp75 = getelementptr i8, i8* null, i32 %next |
Andrew Trick | 8de329a | 2011-10-04 03:50:44 +0000 | [diff] [blame] | 24 | br i1 false, label %loop, label %loopexit |
| 25 | |
| 26 | loopexit: |
| 27 | br i1 false, label %bbA, label %bbB |
| 28 | |
| 29 | bbA: |
| 30 | switch i32 0, label %bb89 [ |
| 31 | i32 47, label %bb89 |
| 32 | i32 58, label %bb89 |
| 33 | ] |
| 34 | |
| 35 | bbB: |
| 36 | switch i8 0, label %bb89 [ |
| 37 | i8 47, label %bb89 |
| 38 | i8 58, label %bb89 |
| 39 | ] |
| 40 | |
| 41 | bb89: |
| 42 | %tmp75phi = phi i8* [ %tmp75, %bbA ], [ %tmp75, %bbA ], [ %tmp75, %bbA ], [ %tmp75, %bbB ], [ %tmp75, %bbB ], [ %tmp75, %bbB ] |
| 43 | br label %exit |
| 44 | |
| 45 | exit: |
| 46 | ret i8* %tmp75phi |
| 47 | } |
Andrew Trick | 402edbb | 2012-09-18 17:51:33 +0000 | [diff] [blame] | 48 | |
| 49 | ; Handle single-predecessor phis: PR13756 |
Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 50 | ; CHECK-LABEL: @test2( |
Andrew Trick | 402edbb | 2012-09-18 17:51:33 +0000 | [diff] [blame] | 51 | ; CHECK: bb89: |
| 52 | ; CHECK: phi i8* [ %lsr.iv.next1, %bbA ], [ %lsr.iv.next1, %bbA ], [ %lsr.iv.next1, %bbA ]{{$}} |
| 53 | define i8* @test2() { |
| 54 | entry: |
| 55 | br label %loop |
| 56 | |
| 57 | loop: |
| 58 | %rec = phi i32 [ %next, %loop ], [ 0, %entry ] |
| 59 | %next = add i32 %rec, 1 |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 60 | %tmp75 = getelementptr i8, i8* null, i32 %next |
Andrew Trick | 402edbb | 2012-09-18 17:51:33 +0000 | [diff] [blame] | 61 | br i1 false, label %loop, label %loopexit |
| 62 | |
| 63 | loopexit: |
| 64 | br i1 false, label %bbA, label %bbB |
| 65 | |
| 66 | bbA: |
| 67 | switch i32 0, label %bb89 [ |
| 68 | i32 47, label %bb89 |
| 69 | i32 58, label %bb89 |
| 70 | ] |
| 71 | |
| 72 | bbB: |
| 73 | switch i8 0, label %exit [ |
| 74 | i8 47, label %exit |
| 75 | i8 58, label %exit |
| 76 | ] |
| 77 | |
| 78 | bb89: |
| 79 | %tmp75phi = phi i8* [ %tmp75, %bbA ], [ %tmp75, %bbA ], [ %tmp75, %bbA ] |
| 80 | br label %exit |
| 81 | |
| 82 | exit: |
| 83 | %result = phi i8* [ %tmp75phi, %bb89 ], [ %tmp75, %bbB ], [ %tmp75, %bbB ], [ %tmp75, %bbB ] |
| 84 | ret i8* %result |
| 85 | } |