reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
; REQUIRES: asserts
; RUN: llc -mtriple=thumbv6m -regalloc=greedy -stats < %s 2>&1 | FileCheck %s

; Undef incoming values to phis end up creating IMPLICIT_DEF values. If we don't
; prefer them to be in a register then we get fewer spilled live ranges (6
; compared to 7).
; CHECK: 6 regalloc - Number of spilled live ranges

declare i32 @otherfn(i32)
define void @fn(i32 %val, i32* %ptr) {
entry:
  %gep1 = getelementptr i32, i32* %ptr, i32 0
  %gep2 = getelementptr i32, i32* %ptr, i32 1
  %gep3 = getelementptr i32, i32* %ptr, i32 2
  %gep4 = getelementptr i32, i32* %ptr, i32 3
  %gep5 = getelementptr i32, i32* %ptr, i32 4
  %gep6 = getelementptr i32, i32* %ptr, i32 5
  %gep7 = getelementptr i32, i32* %ptr, i32 6
  %gep8 = getelementptr i32, i32* %ptr, i32 7
  %cmp1 = icmp uge i32 %val, 3
  br i1 %cmp1, label %if, label %then

if:
  %val1 = load i32, i32* %gep1, align 4
  %val2 = load i32, i32* %gep2, align 4
  %val3 = load i32, i32* %gep3, align 4
  %val4 = load i32, i32* %gep4, align 4
  %val5 = load i32, i32* %gep5, align 4
  %val6 = load i32, i32* %gep6, align 4
  %val7 = load i32, i32* %gep7, align 4
  %val8 = load i32, i32* %gep8, align 4
  br label %then

then:
  %phi1a = phi i32 [ %val1, %if ], [ undef, %entry ]
  %phi2a = phi i32 [ %val2, %if ], [ undef, %entry ]
  %phi3a = phi i32 [ %val3, %if ], [ undef, %entry ]
  %phi4a = phi i32 [ %val4, %if ], [ undef, %entry ]
  %phi5a = phi i32 [ %val5, %if ], [ undef, %entry ]
  %phi6a = phi i32 [ %val6, %if ], [ undef, %entry ]
  %phi7a = phi i32 [ %val7, %if ], [ undef, %entry ]
  %phi8a = phi i32 [ %val8, %if ], [ undef, %entry ]
  %switchval = call i32 @otherfn(i32 %val)
  switch i32 %switchval, label %default [
    i32 0, label %case0
    i32 1, label %case1
    i32 5, label %case5
    i32 6, label %case6
    i32 7, label %case7
    i32 8, label %case8
  ]

default:
  br label %switchend

case0:
  br label %switchend

case1:
  br label %switchend

case5:
  br label %switchend

case6:
  br label %switchend

case7:
  br label %switchend

case8:
  br label %switchend

switchend:
  %phi1b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi1a, %case5 ], [ 1, %case6 ], [ 2, %case7 ], [ 1, %case8 ]
  %phi2b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi2a, %case5 ], [ 2, %case6 ], [ 2, %case7 ], [ 1, %case8 ]
  %phi3b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi3a, %case5 ], [ 3, %case6 ], [ 2, %case7 ], [ 1, %case8 ]
  %phi4b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi4a, %case5 ], [ 4, %case6 ], [ 2, %case7 ], [ 1, %case8 ]
  %phi5b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi5a, %case5 ], [ 5, %case6 ], [ 2, %case7 ], [ 1, %case8 ]
  %phi6b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi6a, %case5 ], [ 6, %case6 ], [ 2, %case7 ], [ 1, %case8 ]
  %phi7b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi7a, %case5 ], [ 7, %case6 ], [ 2, %case7 ], [ 1, %case8 ]
  %phi8b = phi i32 [ 0, %default ], [ undef, %case0 ], [ undef, %case1 ], [ %phi8a, %case5 ], [ 8, %case6 ], [ 2, %case7 ], [ 1, %case8 ]
  %cmp2 = icmp uge i32 %val, 4
  br i1 %cmp2, label %if2, label %end

if2:
  store i32 %phi1b, i32* %gep1, align 4
  store i32 %phi2b, i32* %gep2, align 4
  store i32 %phi3b, i32* %gep3, align 4
  store i32 %phi4b, i32* %gep4, align 4
  store i32 %phi5b, i32* %gep5, align 4
  store i32 %phi6b, i32* %gep6, align 4
  store i32 %phi7b, i32* %gep7, align 4
  store i32 %phi8b, i32* %gep8, align 4
  br label %end

end:
  ret void
}