// function selection under type conversion
void foo1(double a, bool b)  {}
void foo1(double a, uint b)  {}
void foo1(double a, int b)   {}
void foo1(double a, float b) {}
void foo1(double a, double b){}

// uint -> int
void foo2(int a, bool b)  {}
void foo2(int a, uint b)  {}
void foo2(int a, int b)   {}
void foo2(int a, float b) {}
void foo2(int a, double b){}

// everything can promote
void foo3(bool b)  {}
void foo4(uint b)  {}
void foo5(int b)   {}
void foo6(float b) {}
void foo7(double b){}

// shorter forward chain better than longer or backward chain
void foo8(float)  {}
void foo8(double) {}
void foo9(int)    {}
void foo9(uint)   {}
void foo10(bool)  {}
void foo10(int)   {}

// shape change is worse
void foo11(float3)  {}
void foo11(double)  {}
void foo11(int3)    {}
void foo11(uint)    {}
void foo12(float1)  {}
void foo12(double3) {}
void foo16(uint)    {}
void foo16(uint2)   {}

// shape change
void foo13(float3)  {}
void foo14(int1)     {}
void foo15(bool1)   {}

float4 PixelShaderFunction(float4 input) : COLOR0
{
    bool b;
    double d;
    uint u;
    int i;
    float f;

    foo1(d, b);
    foo1(d, d);
    foo1(d, u);
    foo1(d, i);
    foo1(d, f);

    foo1(f, b);
    foo1(f, d);
    foo1(f, u);
    foo1(f, i);
    foo1(f, f);

    foo1(u, b);
    foo1(u, d);
    foo1(u, u);
    foo1(u, i);
    foo1(u, f);

    foo1(i, b);
    foo1(i, d);
    foo1(i, u);
    foo1(i, i);
    foo1(i, f);

    foo2(u, b);
    foo2(u, d);
    foo2(u, u);
    foo2(u, i);
    foo2(u, f);

    foo2(i, b);
    foo2(i, d);
    foo2(i, u);
    foo2(i, i);
    foo2(i, f);

    foo3(b);
    foo3(d);
    foo3(u);
    foo3(i);
    foo3(f);

    foo4(b);
    foo4(d);
    foo4(u);
    foo4(i);
    foo4(f);

    foo5(b);
    foo5(d);
    foo5(u);
    foo5(i);
    foo5(f);

    foo6(b);
    foo6(d);
    foo6(u);
    foo6(i);
    foo6(f);

    foo7(b);
    foo7(d);
    foo7(u);
    foo7(i);
    foo7(f);

    foo8(b);
    foo8(u);
    foo8(i);

    foo9(b);
    foo9(f);
    foo9(d);

    foo10(u);
    foo10(f);
    foo10(d);

    foo11(b);
    foo11(f);
    foo12(float3(f));
    foo16(int2(i,i));

    foo13(f);
    foo14(int4(i));
    foo15(b);
    foo15(bool3(b));

    return input;
}