1*4e3d6160SMark Searles; RUN: llc -march=amdgcn < %s | FileCheck %s
2*4e3d6160SMark Searles
3*4e3d6160SMark Searles; Check we can compile this bugpoint-reduced test without an
4*4e3d6160SMark Searles; infinite loop in TLI.SimplifyDemandedBits() due to failure
5*4e3d6160SMark Searles; to use return value of TLO.DAG.UpdateNodeOperands()
6*4e3d6160SMark Searles
7*4e3d6160SMark Searles; Check that code was generated; we know there will be
8*4e3d6160SMark Searles; a s_endpgm, so check for it.
9*4e3d6160SMark Searles
10*4e3d6160SMark Searles@0 = external unnamed_addr addrspace(3) global [462 x float], align 4
11*4e3d6160SMark Searles
12*4e3d6160SMark Searles; Function Attrs: nounwind readnone speculatable
13*4e3d6160SMark Searlesdeclare i32 @llvm.amdgcn.workitem.id.y() #0
14*4e3d6160SMark Searles
15*4e3d6160SMark Searles; Function Attrs: nounwind readnone speculatable
16*4e3d6160SMark Searlesdeclare i32 @llvm.amdgcn.workitem.id.x() #0
17*4e3d6160SMark Searles
18*4e3d6160SMark Searles; Function Attrs: nounwind readnone speculatable
19*4e3d6160SMark Searlesdeclare float @llvm.fmuladd.f32(float, float, float) #0
20*4e3d6160SMark Searles
21*4e3d6160SMark Searles; CHECK: s_endpgm
22*4e3d6160SMark Searlesdefine amdgpu_kernel void @foo(float addrspace(1)* noalias nocapture readonly %arg, float addrspace(1)* noalias nocapture readonly %arg1, float addrspace(1)* noalias nocapture %arg2, float %arg3) local_unnamed_addr !reqd_work_group_size !0 {
23*4e3d6160SMark Searlesbb:
24*4e3d6160SMark Searles  %tmp = tail call i32 @llvm.amdgcn.workitem.id.y()
25*4e3d6160SMark Searles  %tmp4 = tail call i32 @llvm.amdgcn.workitem.id.x()
26*4e3d6160SMark Searles  %tmp5 = and i32 %tmp, 15
27*4e3d6160SMark Searles  %tmp6 = mul nuw nsw i32 %tmp5, 21
28*4e3d6160SMark Searles  %tmp7 = sub i32 %tmp6, 0
29*4e3d6160SMark Searles  %tmp8 = add i32 %tmp7, 0
30*4e3d6160SMark Searles  %tmp9 = add i32 %tmp8, 0
31*4e3d6160SMark Searles  %tmp10 = getelementptr inbounds [462 x float], [462 x float] addrspace(3)* @0, i32 0, i32 0
32*4e3d6160SMark Searles  br label %bb12
33*4e3d6160SMark Searles
34*4e3d6160SMark Searlesbb11:                                             ; preds = %bb30
35*4e3d6160SMark Searles  br i1 undef, label %bb37, label %bb38
36*4e3d6160SMark Searles
37*4e3d6160SMark Searlesbb12:                                             ; preds = %bb30, %bb
38*4e3d6160SMark Searles  br i1 false, label %.preheader, label %.loopexit145
39*4e3d6160SMark Searles
40*4e3d6160SMark Searles.loopexit145:                                     ; preds = %.preheader, %bb12
41*4e3d6160SMark Searles  br label %bb13
42*4e3d6160SMark Searles
43*4e3d6160SMark Searlesbb13:                                             ; preds = %.loopexit, %.loopexit145
44*4e3d6160SMark Searles  %tmp14 = phi i32 [ %tmp5, %.loopexit145 ], [ %tmp20, %.loopexit ]
45*4e3d6160SMark Searles  %tmp15 = add nsw i32 %tmp14, -3
46*4e3d6160SMark Searles  %tmp16 = mul i32 %tmp14, 21
47*4e3d6160SMark Searles  br i1 undef, label %bb17, label %.loopexit
48*4e3d6160SMark Searles
49*4e3d6160SMark Searlesbb17:                                             ; preds = %bb13
50*4e3d6160SMark Searles  %tmp18 = mul i32 %tmp15, 224
51*4e3d6160SMark Searles  %tmp19 = add i32 undef, %tmp18
52*4e3d6160SMark Searles  br label %bb21
53*4e3d6160SMark Searles
54*4e3d6160SMark Searles.loopexit:                                        ; preds = %bb21, %bb13
55*4e3d6160SMark Searles  %tmp20 = add nuw nsw i32 %tmp14, 16
56*4e3d6160SMark Searles  br i1 undef, label %bb13, label %bb26
57*4e3d6160SMark Searles
58*4e3d6160SMark Searlesbb21:                                             ; preds = %bb21, %bb17
59*4e3d6160SMark Searles  %tmp22 = phi i32 [ %tmp4, %bb17 ], [ %tmp25, %bb21 ]
60*4e3d6160SMark Searles  %tmp23 = add i32 %tmp22, %tmp16
61*4e3d6160SMark Searles  %tmp24 = getelementptr inbounds float, float addrspace(3)* %tmp10, i32 %tmp23
62*4e3d6160SMark Searles  store float undef, float addrspace(3)* %tmp24, align 4
63*4e3d6160SMark Searles  %tmp25 = add nuw i32 %tmp22, 8
64*4e3d6160SMark Searles  br i1 undef, label %bb21, label %.loopexit
65*4e3d6160SMark Searles
66*4e3d6160SMark Searlesbb26:                                             ; preds = %.loopexit
67*4e3d6160SMark Searles  br label %bb31
68*4e3d6160SMark Searles
69*4e3d6160SMark Searles.preheader:                                       ; preds = %.preheader, %bb12
70*4e3d6160SMark Searles  %tmp27 = phi i32 [ %tmp28, %.preheader ], [ undef, %bb12 ]
71*4e3d6160SMark Searles  %tmp28 = add nuw i32 %tmp27, 128
72*4e3d6160SMark Searles  %tmp29 = icmp ult i32 %tmp28, 1568
73*4e3d6160SMark Searles  br i1 %tmp29, label %.preheader, label %.loopexit145
74*4e3d6160SMark Searles
75*4e3d6160SMark Searlesbb30:                                             ; preds = %bb31
76*4e3d6160SMark Searles  br i1 undef, label %bb11, label %bb12
77*4e3d6160SMark Searles
78*4e3d6160SMark Searlesbb31:                                             ; preds = %bb31, %bb26
79*4e3d6160SMark Searles  %tmp32 = phi i32 [ %tmp9, %bb26 ], [ undef, %bb31 ]
80*4e3d6160SMark Searles  %tmp33 = getelementptr inbounds [462 x float], [462 x float] addrspace(3)* @0, i32 0, i32 %tmp32
81*4e3d6160SMark Searles  %tmp34 = load float, float addrspace(3)* %tmp33, align 4
82*4e3d6160SMark Searles  %tmp35 = tail call float @llvm.fmuladd.f32(float %tmp34, float undef, float undef)
83*4e3d6160SMark Searles  %tmp36 = tail call float @llvm.fmuladd.f32(float undef, float undef, float %tmp35)
84*4e3d6160SMark Searles  br i1 undef, label %bb30, label %bb31
85*4e3d6160SMark Searles
86*4e3d6160SMark Searlesbb37:                                             ; preds = %bb11
87*4e3d6160SMark Searles  br label %bb38
88*4e3d6160SMark Searles
89*4e3d6160SMark Searlesbb38:                                             ; preds = %bb37, %bb11
90*4e3d6160SMark Searles  ret void
91*4e3d6160SMark Searles}
92*4e3d6160SMark Searles
93*4e3d6160SMark Searlesattributes #0 = { nounwind readnone speculatable }
94*4e3d6160SMark Searles
95*4e3d6160SMark Searles!0 = !{i32 8, i32 16, i32 1}
96