Compiler projects using llvm
; RUN: llc -march=hexagon -hexagon-initial-cfg-cleanup=0 -hexagon-instsimplify=0 < %s | FileCheck %s
; REQUIRES: asserts

; Test that the compiler doesn't assert because IMPLICIT_DEF instructions are
; are added to the same packet as a use. This test case asserts if the
; IMPLICIT_DEFs are not handled properly.
;
; r0 = IMPLICIT_DEF
; r1 = IMPLICIT_DEF
; S2_storerd_io r29, 0, d0

; CHECK: memd(r29+#0) = r{{[0-9]+}}:{{[0-9]+}}
; CHECK: memd(r29+#0) = r{{[0-9]+}}:{{[0-9]+}}

define i8** @f0(i8* %a0) local_unnamed_addr {
b0:
  %v0 = tail call i8* @f1(i32 0)
  %v1 = tail call i8* @f1(i32 8)
  %v2 = bitcast i8* %v1 to i8**
  %v3 = load i32, i32* undef, align 4
  %v4 = tail call i8* @f4(i8* %a0, i32 0, i32 %v3)
  %v5 = sub nsw i32 %v3, 0
  br label %b1

b1:                                               ; preds = %b0
  switch i8 undef, label %b3 [
    i8 0, label %b4
    i8 92, label %b2
    i8 44, label %b4
  ]

b2:                                               ; preds = %b1
  unreachable

b3:                                               ; preds = %b1
  unreachable

b4:                                               ; preds = %b1, %b1
  br label %b5

b5:                                               ; preds = %b4
  br i1 undef, label %b27, label %b6

b6:                                               ; preds = %b5
  %v6 = ptrtoint i8* %v4 to i32
  %v7 = sub i32 0, %v6
  %v8 = call i8* @f4(i8* nonnull %v4, i32 0, i32 %v7)
  %v9 = call i8* @f4(i8* nonnull %v4, i32 undef, i32 %v5)
  br label %b7

b7:                                               ; preds = %b6
  br i1 undef, label %b8, label %b9

b8:                                               ; preds = %b7
  br label %b9

b9:                                               ; preds = %b8, %b7
  %v10 = phi i32 [ 2, %b8 ], [ 0, %b7 ]
  %v11 = load i8, i8* %v9, align 1
  switch i8 %v11, label %b12 [
    i8 43, label %b10
    i8 45, label %b10
  ]

b10:                                              ; preds = %b9, %b9
  br i1 undef, label %b11, label %b12

b11:                                              ; preds = %b10
  %v12 = call i64 @f6(i8* nonnull %v9, i8** nonnull undef, i32 10)
  %v13 = load i8*, i8** undef, align 4
  %v14 = ptrtoint i8* %v13 to i32
  br label %b15

b12:                                              ; preds = %b10, %b9
  switch i8 undef, label %b14 [
    i8 0, label %b13
    i8 46, label %b13
  ]

b13:                                              ; preds = %b12, %b12
  br label %b15

b14:                                              ; preds = %b12
  unreachable

b15:                                              ; preds = %b13, %b11
  %v15 = phi i32 [ undef, %b13 ], [ %v14, %b11 ]
  %v16 = phi i32 [ 2, %b13 ], [ 1, %b11 ]
  %v17 = phi i64 [ undef, %b13 ], [ %v12, %b11 ]
  %v18 = call i32* @f5()
  br label %b16

b16:                                              ; preds = %b15
  %v19 = icmp ne i32 %v10, %v16
  %v20 = or i1 undef, %v19
  br i1 %v20, label %b17, label %b18

b17:                                              ; preds = %b16
  call void @f2(i8* %v8)
  br label %b27

b18:                                              ; preds = %b16
  br i1 undef, label %b19, label %b20

b19:                                              ; preds = %b18
  br label %b24

b20:                                              ; preds = %b18
  %v21 = add i32 %v5, -2
  %v22 = sub i32 %v21, %v7
  %v23 = add i32 %v22, %v15
  %v24 = sub i32 %v23, 0
  br label %b21

b21:                                              ; preds = %b20
  %v25 = icmp ne i32 %v24, 2
  %v26 = and i1 %v25, undef
  br i1 %v26, label %b22, label %b23

b22:                                              ; preds = %b21
  unreachable

b23:                                              ; preds = %b21
  br label %b24

b24:                                              ; preds = %b23, %b19
  %v27 = phi i64 [ 0, %b19 ], [ %v17, %b23 ]
  br label %b25

b25:                                              ; preds = %b24
  %v28 = icmp sgt i64 0, %v27
  br i1 %v28, label %b28, label %b26

b26:                                              ; preds = %b25
  unreachable

b27:                                              ; preds = %b17, %b5
  call void @f2(i8* %v4)
  call void @f2(i8* %v0)
  %v29 = call i8* @f3(i8* undef, i8* nonnull %a0)
  ret i8** %v2

b28:                                              ; preds = %b25
  call void @f2(i8* %v9)
  unreachable
}

declare i8* @f1(i32) local_unnamed_addr

declare void @f2(i8* nocapture) local_unnamed_addr

declare i8* @f3(i8*, i8* nocapture readonly) local_unnamed_addr

declare i8* @f4(i8*, i32, i32) local_unnamed_addr

declare i32* @f5() local_unnamed_addr

declare i64 @f6(i8*, i8**, i32) local_unnamed_addr