Home | History | Annotate | Download | only in NewGVN
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ;; Ensure we don't change after value numbering by accidentally deleting the wrong expression.
      3 ; RUN: opt -newgvn -S %s | FileCheck %s
      4 define void @fn1() local_unnamed_addr #0 {
      5 ; CHECK-LABEL: @fn1(
      6 ; CHECK-NEXT:  entry:
      7 ; CHECK-NEXT:    br label [[FOR_COND_PREHEADER:%.*]]
      8 ; CHECK:       while.cond:
      9 ; CHECK-NEXT:    br label [[FOR_COND_PREHEADER]]
     10 ; CHECK:       for.cond.preheader:
     11 ; CHECK-NEXT:    [[H_031:%.*]] = phi i32 [ 5, [[ENTRY:%.*]] ], [ [[H_127:%.*]], [[WHILE_COND:%.*]] ]
     12 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
     13 ; CHECK:       for.body:
     14 ; CHECK-NEXT:    [[H_128:%.*]] = phi i32 [ [[H_031]], [[FOR_COND_PREHEADER]] ], [ [[H_2:%.*]], [[FOR_INC:%.*]] ]
     15 ; CHECK-NEXT:    br label [[IF_THEN:%.*]]
     16 ; CHECK:       if.then:
     17 ; CHECK-NEXT:    br i1 false, label [[L_LOOPEXIT:%.*]], label [[IF_END:%.*]]
     18 ; CHECK:       if.end:
     19 ; CHECK-NEXT:    br i1 undef, label [[FOR_INC]], label [[IF_END9:%.*]]
     20 ; CHECK:       if.end9:
     21 ; CHECK-NEXT:    br label [[FOR_INC]]
     22 ; CHECK:       for.inc:
     23 ; CHECK-NEXT:    [[H_2]] = phi i32 [ [[H_128]], [[IF_END]] ], [ 0, [[IF_END9]] ]
     24 ; CHECK-NEXT:    br i1 undef, label [[WHILE_COND10_LOOPEXIT:%.*]], label [[FOR_BODY]]
     25 ; CHECK:       while.cond10.loopexit:
     26 ; CHECK-NEXT:    br label [[WHILE_COND10:%.*]]
     27 ; CHECK:       while.cond10:
     28 ; CHECK-NEXT:    [[H_127]] = phi i32 [ [[H_126:%.*]], [[IF_END18:%.*]] ], [ [[H_125:%.*]], [[L:%.*]] ], [ [[H_2]], [[WHILE_COND10_LOOPEXIT]] ]
     29 ; CHECK-NEXT:    br i1 undef, label [[WHILE_COND]], label [[WHILE_BODY12:%.*]]
     30 ; CHECK:       while.body12:
     31 ; CHECK-NEXT:    br i1 undef, label [[IF_END18]], label [[L]]
     32 ; CHECK:       L.loopexit:
     33 ; CHECK-NEXT:    store i8 undef, i8* null
     34 ; CHECK-NEXT:    br label [[L]]
     35 ; CHECK:       L:
     36 ; CHECK-NEXT:    [[H_125]] = phi i32 [ [[H_127]], [[WHILE_BODY12]] ], [ undef, [[L_LOOPEXIT]] ]
     37 ; CHECK-NEXT:    br i1 undef, label [[WHILE_COND10]], label [[IF_END18]]
     38 ; CHECK:       if.end18:
     39 ; CHECK-NEXT:    [[H_126]] = phi i32 [ [[H_125]], [[L]] ], [ [[H_127]], [[WHILE_BODY12]] ]
     40 ; CHECK-NEXT:    br label [[WHILE_COND10]]
     41 ;
     42 entry:
     43   br label %for.cond.preheader
     44 
     45 while.cond:                                       ; preds = %while.cond10
     46   br label %for.cond.preheader
     47 
     48 for.cond.preheader:                               ; preds = %while.cond, %entry
     49   %h.031 = phi i32 [ 5, %entry ], [ %h.127, %while.cond ]
     50   br label %for.body
     51 
     52 for.body:                                         ; preds = %for.inc, %for.cond.preheader
     53   %h.128 = phi i32 [ %h.031, %for.cond.preheader ], [ %h.2, %for.inc ]
     54   br label %if.then
     55 
     56 if.then:                                          ; preds = %for.body
     57   br i1 false, label %L.loopexit, label %if.end
     58 
     59 if.end:                                           ; preds = %if.then
     60   br i1 undef, label %for.inc, label %if.end9
     61 
     62 if.end9:                                          ; preds = %if.end
     63   br label %for.inc
     64 
     65 for.inc:                                          ; preds = %if.end9, %if.end
     66   %h.2 = phi i32 [ %h.128, %if.end ], [ 0, %if.end9 ]
     67   br i1 undef, label %while.cond10.loopexit, label %for.body
     68 
     69 while.cond10.loopexit:                            ; preds = %for.inc
     70   %h.2.lcssa = phi i32 [ %h.2, %for.inc ]
     71   br label %while.cond10
     72 
     73 while.cond10:                                     ; preds = %if.end18, %L, %while.cond10.loopexit
     74   %h.127 = phi i32 [ %h.126, %if.end18 ], [ %h.125, %L ], [ %h.2.lcssa, %while.cond10.loopexit ]
     75   br i1 undef, label %while.cond, label %while.body12
     76 
     77 while.body12:                                     ; preds = %while.cond10
     78   br i1 undef, label %if.end18, label %L
     79 
     80 L.loopexit:                                       ; preds = %if.then
     81   br label %L
     82 
     83 L:                                                ; preds = %L.loopexit, %while.body12
     84   %h.125 = phi i32 [ %h.127, %while.body12 ], [ undef, %L.loopexit ]
     85   br i1 undef, label %while.cond10, label %if.end18
     86 
     87 if.end18:                                         ; preds = %L, %while.body12
     88   %h.126 = phi i32 [ %h.125, %L ], [ %h.127, %while.body12 ]
     89   br label %while.cond10
     90 }
     91 
     92 
     93 define void @hoge() local_unnamed_addr #0 {
     94 ; CHECK-LABEL: @hoge(
     95 ; CHECK-NEXT:  bb:
     96 ; CHECK-NEXT:    br label [[BB1:%.*]]
     97 ; CHECK:       bb1:
     98 ; CHECK-NEXT:    [[TMP:%.*]] = phi i64 [ 0, [[BB:%.*]] ], [ [[TMP2:%.*]], [[BB1]] ]
     99 ; CHECK-NEXT:    [[TMP2]] = add nuw nsw i64 [[TMP]], 1
    100 ; CHECK-NEXT:    br label [[BB1]]
    101 ;
    102 bb:
    103   br label %bb1
    104 
    105 bb1:                                              ; preds = %bb1, %bb
    106   %tmp = phi i64 [ 0, %bb ], [ %tmp2, %bb1 ]
    107   %tmp2 = add nuw nsw i64 %tmp, 1
    108   br label %bb1
    109 }
    110 
    111 attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
    112 
    113 
    114 source_filename = "pr33187-c.ll"
    115 
    116 define void @a() {
    117 ; CHECK-LABEL: @a(
    118 ; CHECK-NEXT:  b:
    119 ; CHECK-NEXT:    store i8* null, i8** null
    120 ; CHECK-NEXT:    br label [[D:%.*]]
    121 ; CHECK:       d:
    122 ; CHECK-NEXT:    [[I:%.*]] = phi i8* [ null, [[B:%.*]] ], [ [[E:%.*]], [[F:%.*]] ]
    123 ; CHECK-NEXT:    br i1 undef, label [[F]], label [[G:%.*]]
    124 ; CHECK:       g:
    125 ; CHECK-NEXT:    store i8* [[I]], i8** null
    126 ; CHECK-NEXT:    unreachable
    127 ; CHECK:       f:
    128 ; CHECK-NEXT:    [[E]] = getelementptr i8, i8* [[I]], i64 1
    129 ; CHECK-NEXT:    br label [[D]]
    130 ;
    131 b:
    132   store i8* null, i8** null
    133   br label %d
    134 
    135 d:                                                ; preds = %f, %b
    136   %i = phi i8* [ null, %b ], [ %e, %f ]
    137   br i1 undef, label %f, label %g
    138 
    139 g:                                                ; preds = %d
    140   %h = phi i8* [ %i, %d ]
    141   store i8* %h, i8** null
    142   unreachable
    143 
    144 f:                                                ; preds = %d
    145   %e = getelementptr i8, i8* %i, i64 1
    146   br label %d
    147 }
    148 
    149