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
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
; RUN: llc -march=hexagon < %s
; REQUIRES: asserts

; After a copy R20 = R29, RDF copy propagation attempted to replace R20 with
; R29. R29 did not have a reaching def at that point (which isn't unusual),
; but copy propagation tried to link the new use of R29 to the presumed
; reaching def (which was null), causing a crash.

target triple = "hexagon"

@g0 = external unnamed_addr global i1, align 4

; Function Attrs: nounwind
declare i8* @llvm.stacksave() #0

; Function Attrs: nounwind
declare void @llvm.stackrestore(i8*) #0

; Function Attrs: norecurse nounwind
declare fastcc void @f0(i16 signext, i16 signext, i16 signext, i16* nocapture readonly, i16 signext, i16* nocapture) unnamed_addr #1

; Function Attrs: norecurse nounwind
declare fastcc signext i16 @f1(i16 signext, i16 signext) unnamed_addr #1

; Function Attrs: norecurse nounwind
define fastcc i32 @f2(i16* nocapture readonly %a0, i16 signext %a1, i16 signext %a2, i16* nocapture readonly %a3, i16 signext %a4, i16* nocapture readonly %a51, i16* nocapture %a6) unnamed_addr #1 {
b0:
  %v0 = tail call i8* @llvm.stacksave()
  %v1 = tail call fastcc signext i16 @f1(i16 signext %a2, i16 signext %a1)
  br i1 undef, label %b7, label %b1

b1:                                               ; preds = %b0
  br i1 undef, label %b3, label %b2

b2:                                               ; preds = %b1
  br i1 undef, label %b4, label %b8

b3:                                               ; preds = %b1
  br i1 undef, label %b5, label %b8

b4:                                               ; preds = %b4, %b2
  br i1 undef, label %b4, label %b6, !llvm.loop !2

b5:                                               ; preds = %b5, %b3
  %v2 = phi i16 [ %v3, %b5 ], [ 0, %b3 ]
  %v3 = add i16 %v2, 1
  %v4 = icmp sgt i32 0, -1073741825
  br i1 %v4, label %b5, label %b6

b6:                                               ; preds = %b5, %b4
  %v5 = phi i16 [ %v3, %b5 ], [ undef, %b4 ]
  br label %b7

b7:                                               ; preds = %b6, %b0
  %v6 = phi i16 [ %v5, %b6 ], [ 0, %b0 ]
  br i1 undef, label %b9, label %b8

b8:                                               ; preds = %b7, %b3, %b2
  %v7 = or i32 0, undef
  br label %b9

b9:                                               ; preds = %b8, %b7
  %v8 = phi i16 [ 0, %b8 ], [ %v6, %b7 ]
  %v9 = phi i32 [ %v7, %b8 ], [ 0, %b7 ]
  %v10 = load i16, i16* undef, align 2, !tbaa !4
  %v11 = sext i16 %v10 to i32
  %v12 = zext i16 %v10 to i32
  br i1 undef, label %b10, label %b11

b10:                                              ; preds = %b9
  store i1 true, i1* @g0, align 4
  br label %b11

b11:                                              ; preds = %b10, %b9
  %v13 = load i16, i16* undef, align 2, !tbaa !4
  %v14 = sext i16 %v13 to i32
  %v15 = shl nuw i32 %v12, 16
  %v16 = and i32 %v9, 65535
  %v17 = mul nsw i32 %v11, %v16
  %v18 = sitofp i32 %v15 to double
  %v19 = fsub double %v18, undef
  %v20 = sub nsw i32 %v15, %v17
  %v21 = fptosi double %v19 to i32
  %v22 = select i1 undef, i32 %v21, i32 %v20
  %v23 = mul nsw i32 %v14, %v16
  %v24 = add nsw i32 %v23, %v22
  %v25 = add nsw i32 %v24, 32768
  %v26 = lshr i32 %v25, 16
  %v27 = xor i1 undef, true
  %v28 = and i1 %v27, undef
  br i1 %v28, label %b12, label %b13

b12:                                              ; preds = %b11
  store i1 true, i1* @g0, align 4
  br label %b13

b13:                                              ; preds = %b12, %b11
  br i1 undef, label %b14, label %b24

b14:                                              ; preds = %b13
  br label %b15

b15:                                              ; preds = %b23, %b14
  br i1 undef, label %b16, label %b17

b16:                                              ; preds = %b15
  br label %b19

b17:                                              ; preds = %b15
  %v29 = trunc i32 %v26 to i16
  %v30 = icmp eq i16 %v29, -32768
  %v31 = and i1 undef, %v30
  br i1 %v31, label %b18, label %b19

b18:                                              ; preds = %b17
  store i1 true, i1* @g0, align 4
  br label %b20

b19:                                              ; preds = %b17, %b16
  br label %b20

b20:                                              ; preds = %b19, %b18
  %v32 = phi i32 [ 2147483647, %b18 ], [ 0, %b19 ]
  %v33 = icmp eq i16 %v8, 32767
  br i1 %v33, label %b21, label %b22

b21:                                              ; preds = %b20
  store i1 true, i1* @g0, align 4
  br label %b23

b22:                                              ; preds = %b20
  br label %b23

b23:                                              ; preds = %b22, %b21
  %v34 = add nsw i32 %v32, 32768
  %v35 = lshr i32 %v34, 16
  %v36 = trunc i32 %v35 to i16
  store i16 %v36, i16* undef, align 2, !tbaa !4
  br i1 undef, label %b24, label %b15

b24:                                              ; preds = %b23, %b13
  call fastcc void @f0(i16 signext undef, i16 signext %a1, i16 signext %a2, i16* %a3, i16 signext %a4, i16* %a6)
  call void @llvm.stackrestore(i8* %v0)
  ret i32 undef
}

attributes #0 = { nounwind }
attributes #1 = { norecurse nounwind "target-cpu"="hexagonv60" "target-features"="+hvx,+hvx-length64b" }

!llvm.module.flags = !{!0}

!0 = !{i32 6, !"Target Features", !1}
!1 = !{!"+hvx,+hvx-length64b"}
!2 = distinct !{!2, !3}
!3 = !{!"llvm.loop.threadify", i32 43789156}
!4 = !{!5, !5, i64 0}
!5 = !{!"short", !6, i64 0}
!6 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}