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