1*9880d681SAndroid Build Coastguard Worker; XFAIL: * 2*9880d681SAndroid Build Coastguard Worker; REQUIRES: asserts 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -march=amdgcn -mcpu=SI -verify-machineinstrs< %s | FileCheck %s -check-prefix=SI 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -march=amdgcn -mcpu=tonga -verify-machineinstrs< %s | FileCheck %s -check-prefix=SI 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.AMDGPU.barrier.local() nounwind convergent 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}main( 10*9880d681SAndroid Build Coastguard Workerdefine amdgpu_vs void @main(<4 x float> inreg %reg0, <4 x float> inreg %reg1) { 11*9880d681SAndroid Build Coastguard Workermain_body: 12*9880d681SAndroid Build Coastguard Worker %0 = extractelement <4 x float> %reg1, i32 0 13*9880d681SAndroid Build Coastguard Worker %1 = extractelement <4 x float> %reg1, i32 2 14*9880d681SAndroid Build Coastguard Worker %2 = fcmp ult float %0, 0.000000e+00 15*9880d681SAndroid Build Coastguard Worker %3 = select i1 %2, float 1.000000e+00, float 0.000000e+00 16*9880d681SAndroid Build Coastguard Worker %4 = fsub float -0.000000e+00, %3 17*9880d681SAndroid Build Coastguard Worker %5 = fptosi float %4 to i32 18*9880d681SAndroid Build Coastguard Worker %6 = bitcast i32 %5 to float 19*9880d681SAndroid Build Coastguard Worker %7 = bitcast float %6 to i32 20*9880d681SAndroid Build Coastguard Worker %8 = icmp ne i32 %7, 0 21*9880d681SAndroid Build Coastguard Worker br i1 %8, label %LOOP, label %ENDIF 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard WorkerFlow1: ; preds = %ENDIF19, %ENDIF16 24*9880d681SAndroid Build Coastguard Worker %9 = phi float [ %115, %ENDIF19 ], [ undef, %ENDIF16 ] 25*9880d681SAndroid Build Coastguard Worker %10 = phi float [ %114, %ENDIF19 ], [ undef, %ENDIF16 ] 26*9880d681SAndroid Build Coastguard Worker %11 = phi float [ %113, %ENDIF19 ], [ undef, %ENDIF16 ] 27*9880d681SAndroid Build Coastguard Worker %12 = phi float [ %112, %ENDIF19 ], [ undef, %ENDIF16 ] 28*9880d681SAndroid Build Coastguard Worker %13 = phi float [ %111, %ENDIF19 ], [ undef, %ENDIF16 ] 29*9880d681SAndroid Build Coastguard Worker %14 = phi i1 [ false, %ENDIF19 ], [ true, %ENDIF16 ] 30*9880d681SAndroid Build Coastguard Worker br label %Flow 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard WorkerFlow2: ; preds = %Flow 33*9880d681SAndroid Build Coastguard Worker br label %ENDIF 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard WorkerENDIF: ; preds = %main_body, %Flow2 36*9880d681SAndroid Build Coastguard Worker %temp.0 = phi float [ 0.000000e+00, %main_body ], [ %104, %Flow2 ] 37*9880d681SAndroid Build Coastguard Worker %temp1.0 = phi float [ 1.000000e+00, %main_body ], [ %103, %Flow2 ] 38*9880d681SAndroid Build Coastguard Worker %temp2.0 = phi float [ 0.000000e+00, %main_body ], [ %102, %Flow2 ] 39*9880d681SAndroid Build Coastguard Worker %temp3.0 = phi float [ 0.000000e+00, %main_body ], [ %101, %Flow2 ] 40*9880d681SAndroid Build Coastguard Worker %15 = extractelement <4 x float> %reg1, i32 1 41*9880d681SAndroid Build Coastguard Worker %16 = extractelement <4 x float> %reg1, i32 3 42*9880d681SAndroid Build Coastguard Worker %17 = load <4 x float>, <4 x float> addrspace(9)* null 43*9880d681SAndroid Build Coastguard Worker %18 = extractelement <4 x float> %17, i32 0 44*9880d681SAndroid Build Coastguard Worker %19 = fmul float %18, %0 45*9880d681SAndroid Build Coastguard Worker %20 = load <4 x float>, <4 x float> addrspace(9)* null 46*9880d681SAndroid Build Coastguard Worker %21 = extractelement <4 x float> %20, i32 1 47*9880d681SAndroid Build Coastguard Worker %22 = fmul float %21, %0 48*9880d681SAndroid Build Coastguard Worker %23 = load <4 x float>, <4 x float> addrspace(9)* null 49*9880d681SAndroid Build Coastguard Worker %24 = extractelement <4 x float> %23, i32 2 50*9880d681SAndroid Build Coastguard Worker %25 = fmul float %24, %0 51*9880d681SAndroid Build Coastguard Worker %26 = load <4 x float>, <4 x float> addrspace(9)* null 52*9880d681SAndroid Build Coastguard Worker %27 = extractelement <4 x float> %26, i32 3 53*9880d681SAndroid Build Coastguard Worker %28 = fmul float %27, %0 54*9880d681SAndroid Build Coastguard Worker %29 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) 55*9880d681SAndroid Build Coastguard Worker %30 = extractelement <4 x float> %29, i32 0 56*9880d681SAndroid Build Coastguard Worker %31 = fmul float %30, %15 57*9880d681SAndroid Build Coastguard Worker %32 = fadd float %31, %19 58*9880d681SAndroid Build Coastguard Worker %33 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) 59*9880d681SAndroid Build Coastguard Worker %34 = extractelement <4 x float> %33, i32 1 60*9880d681SAndroid Build Coastguard Worker %35 = fmul float %34, %15 61*9880d681SAndroid Build Coastguard Worker %36 = fadd float %35, %22 62*9880d681SAndroid Build Coastguard Worker %37 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) 63*9880d681SAndroid Build Coastguard Worker %38 = extractelement <4 x float> %37, i32 2 64*9880d681SAndroid Build Coastguard Worker %39 = fmul float %38, %15 65*9880d681SAndroid Build Coastguard Worker %40 = fadd float %39, %25 66*9880d681SAndroid Build Coastguard Worker %41 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) 67*9880d681SAndroid Build Coastguard Worker %42 = extractelement <4 x float> %41, i32 3 68*9880d681SAndroid Build Coastguard Worker %43 = fmul float %42, %15 69*9880d681SAndroid Build Coastguard Worker %44 = fadd float %43, %28 70*9880d681SAndroid Build Coastguard Worker %45 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) 71*9880d681SAndroid Build Coastguard Worker %46 = extractelement <4 x float> %45, i32 0 72*9880d681SAndroid Build Coastguard Worker %47 = fmul float %46, %1 73*9880d681SAndroid Build Coastguard Worker %48 = fadd float %47, %32 74*9880d681SAndroid Build Coastguard Worker %49 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) 75*9880d681SAndroid Build Coastguard Worker %50 = extractelement <4 x float> %49, i32 1 76*9880d681SAndroid Build Coastguard Worker %51 = fmul float %50, %1 77*9880d681SAndroid Build Coastguard Worker %52 = fadd float %51, %36 78*9880d681SAndroid Build Coastguard Worker %53 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) 79*9880d681SAndroid Build Coastguard Worker %54 = extractelement <4 x float> %53, i32 2 80*9880d681SAndroid Build Coastguard Worker %55 = fmul float %54, %1 81*9880d681SAndroid Build Coastguard Worker %56 = fadd float %55, %40 82*9880d681SAndroid Build Coastguard Worker %57 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) 83*9880d681SAndroid Build Coastguard Worker %58 = extractelement <4 x float> %57, i32 3 84*9880d681SAndroid Build Coastguard Worker %59 = fmul float %58, %1 85*9880d681SAndroid Build Coastguard Worker %60 = fadd float %59, %44 86*9880d681SAndroid Build Coastguard Worker %61 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) 87*9880d681SAndroid Build Coastguard Worker %62 = extractelement <4 x float> %61, i32 0 88*9880d681SAndroid Build Coastguard Worker %63 = fmul float %62, %16 89*9880d681SAndroid Build Coastguard Worker %64 = fadd float %63, %48 90*9880d681SAndroid Build Coastguard Worker %65 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) 91*9880d681SAndroid Build Coastguard Worker %66 = extractelement <4 x float> %65, i32 1 92*9880d681SAndroid Build Coastguard Worker %67 = fmul float %66, %16 93*9880d681SAndroid Build Coastguard Worker %68 = fadd float %67, %52 94*9880d681SAndroid Build Coastguard Worker %69 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) 95*9880d681SAndroid Build Coastguard Worker %70 = extractelement <4 x float> %69, i32 2 96*9880d681SAndroid Build Coastguard Worker %71 = fmul float %70, %16 97*9880d681SAndroid Build Coastguard Worker %72 = fadd float %71, %56 98*9880d681SAndroid Build Coastguard Worker %73 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) 99*9880d681SAndroid Build Coastguard Worker %74 = extractelement <4 x float> %73, i32 3 100*9880d681SAndroid Build Coastguard Worker %75 = fmul float %74, %16 101*9880d681SAndroid Build Coastguard Worker %76 = fadd float %75, %60 102*9880d681SAndroid Build Coastguard Worker %77 = insertelement <4 x float> undef, float %64, i32 0 103*9880d681SAndroid Build Coastguard Worker %78 = insertelement <4 x float> %77, float %68, i32 1 104*9880d681SAndroid Build Coastguard Worker %79 = insertelement <4 x float> %78, float %72, i32 2 105*9880d681SAndroid Build Coastguard Worker %80 = insertelement <4 x float> %79, float %76, i32 3 106*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.barrier.local() 107*9880d681SAndroid Build Coastguard Worker %81 = insertelement <4 x float> undef, float %temp.0, i32 0 108*9880d681SAndroid Build Coastguard Worker %82 = insertelement <4 x float> %81, float %temp1.0, i32 1 109*9880d681SAndroid Build Coastguard Worker %83 = insertelement <4 x float> %82, float %temp2.0, i32 2 110*9880d681SAndroid Build Coastguard Worker %84 = insertelement <4 x float> %83, float %temp3.0, i32 3 111*9880d681SAndroid Build Coastguard Worker call void @llvm.AMDGPU.barrier.local() 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard WorkerLOOP: ; preds = %main_body, %Flow 115*9880d681SAndroid Build Coastguard Worker %temp.1 = phi float [ %109, %Flow ], [ 0.000000e+00, %main_body ] 116*9880d681SAndroid Build Coastguard Worker %temp1.1 = phi float [ %108, %Flow ], [ 1.000000e+00, %main_body ] 117*9880d681SAndroid Build Coastguard Worker %temp2.1 = phi float [ %107, %Flow ], [ 0.000000e+00, %main_body ] 118*9880d681SAndroid Build Coastguard Worker %temp3.1 = phi float [ %106, %Flow ], [ 0.000000e+00, %main_body ] 119*9880d681SAndroid Build Coastguard Worker %temp4.0 = phi float [ %105, %Flow ], [ -2.000000e+00, %main_body ] 120*9880d681SAndroid Build Coastguard Worker %85 = fcmp uge float %temp4.0, %0 121*9880d681SAndroid Build Coastguard Worker %86 = select i1 %85, float 1.000000e+00, float 0.000000e+00 122*9880d681SAndroid Build Coastguard Worker %87 = fsub float -0.000000e+00, %86 123*9880d681SAndroid Build Coastguard Worker %88 = fptosi float %87 to i32 124*9880d681SAndroid Build Coastguard Worker %89 = bitcast i32 %88 to float 125*9880d681SAndroid Build Coastguard Worker %90 = bitcast float %89 to i32 126*9880d681SAndroid Build Coastguard Worker %91 = icmp ne i32 %90, 0 127*9880d681SAndroid Build Coastguard Worker %92 = xor i1 %91, true 128*9880d681SAndroid Build Coastguard Worker br i1 %92, label %ENDIF16, label %Flow 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard WorkerENDIF16: ; preds = %LOOP 131*9880d681SAndroid Build Coastguard Worker %93 = fcmp une float %1, %temp4.0 132*9880d681SAndroid Build Coastguard Worker %94 = select i1 %93, float 1.000000e+00, float 0.000000e+00 133*9880d681SAndroid Build Coastguard Worker %95 = fsub float -0.000000e+00, %94 134*9880d681SAndroid Build Coastguard Worker %96 = fptosi float %95 to i32 135*9880d681SAndroid Build Coastguard Worker %97 = bitcast i32 %96 to float 136*9880d681SAndroid Build Coastguard Worker %98 = bitcast float %97 to i32 137*9880d681SAndroid Build Coastguard Worker %99 = icmp ne i32 %98, 0 138*9880d681SAndroid Build Coastguard Worker %100 = xor i1 %99, true 139*9880d681SAndroid Build Coastguard Worker br i1 %100, label %ENDIF19, label %Flow1 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard WorkerFlow: ; preds = %Flow1, %LOOP 142*9880d681SAndroid Build Coastguard Worker %101 = phi float [ %temp3.1, %Flow1 ], [ %temp3.1, %LOOP ] 143*9880d681SAndroid Build Coastguard Worker %102 = phi float [ %temp2.1, %Flow1 ], [ %temp2.1, %LOOP ] 144*9880d681SAndroid Build Coastguard Worker %103 = phi float [ %temp1.1, %Flow1 ], [ %temp1.1, %LOOP ] 145*9880d681SAndroid Build Coastguard Worker %104 = phi float [ %temp.1, %Flow1 ], [ %temp.1, %LOOP ] 146*9880d681SAndroid Build Coastguard Worker %105 = phi float [ %9, %Flow1 ], [ undef, %LOOP ] 147*9880d681SAndroid Build Coastguard Worker %106 = phi float [ %10, %Flow1 ], [ undef, %LOOP ] 148*9880d681SAndroid Build Coastguard Worker %107 = phi float [ %11, %Flow1 ], [ undef, %LOOP ] 149*9880d681SAndroid Build Coastguard Worker %108 = phi float [ %12, %Flow1 ], [ undef, %LOOP ] 150*9880d681SAndroid Build Coastguard Worker %109 = phi float [ %13, %Flow1 ], [ undef, %LOOP ] 151*9880d681SAndroid Build Coastguard Worker %110 = phi i1 [ %14, %Flow1 ], [ true, %LOOP ] 152*9880d681SAndroid Build Coastguard Worker br i1 %110, label %Flow2, label %LOOP 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard WorkerENDIF19: ; preds = %ENDIF16 155*9880d681SAndroid Build Coastguard Worker %111 = fadd float %temp.1, 1.000000e+00 156*9880d681SAndroid Build Coastguard Worker %112 = fadd float %temp1.1, 0.000000e+00 157*9880d681SAndroid Build Coastguard Worker %113 = fadd float %temp2.1, 0.000000e+00 158*9880d681SAndroid Build Coastguard Worker %114 = fadd float %temp3.1, 0.000000e+00 159*9880d681SAndroid Build Coastguard Worker %115 = fadd float %temp4.0, 1.000000e+00 160*9880d681SAndroid Build Coastguard Worker br label %Flow1 161*9880d681SAndroid Build Coastguard Worker} 162