1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorRed, colorGreen; 2*c8dee2aaSAndroid Build Coastguard Workeruniform half unknownInput; 3*c8dee2aaSAndroid Build Coastguard Worker 4*c8dee2aaSAndroid Build Coastguard Workerbool test() { 5*c8dee2aaSAndroid Build Coastguard Worker bool expr = unknownInput > 0; 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Worker int ok = 0, bad = 0; 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker // Test boolean short-circuiting with constants on the left side. 10*c8dee2aaSAndroid Build Coastguard Worker if (true && expr) { ++ok; } else { ++bad; } // -> (expr) 11*c8dee2aaSAndroid Build Coastguard Worker if (false && expr) { ++bad; } else { ++ok; } // -> (false) -> block removed 12*c8dee2aaSAndroid Build Coastguard Worker if (true ^^ expr) { ++bad; } else { ++ok; } // -> unchanged 13*c8dee2aaSAndroid Build Coastguard Worker if (false ^^ expr) { ++ok; } else { ++bad; } // -> (expr) 14*c8dee2aaSAndroid Build Coastguard Worker if (true || expr) { ++ok; } else { ++bad; } // -> (true) 15*c8dee2aaSAndroid Build Coastguard Worker if (false || expr) { ++ok; } else { ++bad; } // -> (expr) 16*c8dee2aaSAndroid Build Coastguard Worker if (true == expr) { ++ok; } else { ++bad; } // -> (expr) 17*c8dee2aaSAndroid Build Coastguard Worker if (false == expr) { ++bad; } else { ++ok; } // -> unchanged 18*c8dee2aaSAndroid Build Coastguard Worker if (true != expr) { ++bad; } else { ++ok; } // -> unchanged 19*c8dee2aaSAndroid Build Coastguard Worker if (false != expr) { ++ok; } else { ++bad; } // -> (expr) 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker // Test boolean short-circuiting with constants on the right side. 22*c8dee2aaSAndroid Build Coastguard Worker if (expr && true ) { ++ok; } else { ++bad; } // -> (expr) 23*c8dee2aaSAndroid Build Coastguard Worker if (expr && false) { ++bad; } else { ++ok; } // -> (false) -> block removed 24*c8dee2aaSAndroid Build Coastguard Worker if (expr ^^ true ) { ++bad; } else { ++ok; } // -> unchanged 25*c8dee2aaSAndroid Build Coastguard Worker if (expr ^^ false) { ++ok; } else { ++bad; } // -> (expr) 26*c8dee2aaSAndroid Build Coastguard Worker if (expr || true ) { ++ok; } else { ++bad; } // -> (true) 27*c8dee2aaSAndroid Build Coastguard Worker if (expr || false) { ++ok; } else { ++bad; } // -> (expr) 28*c8dee2aaSAndroid Build Coastguard Worker if (expr == true ) { ++ok; } else { ++bad; } // -> (expr) 29*c8dee2aaSAndroid Build Coastguard Worker if (expr == false) { ++bad; } else { ++ok; } // -> unchanged 30*c8dee2aaSAndroid Build Coastguard Worker if (expr != true ) { ++bad; } else { ++ok; } // -> unchanged 31*c8dee2aaSAndroid Build Coastguard Worker if (expr != false) { ++ok; } else { ++bad; } // -> (expr) 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker // Test that side-effects in the left-side expression prevent right-side expr elimination. 34*c8dee2aaSAndroid Build Coastguard Worker float a = unknownInput + 2, b = unknownInput * 2; 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker true || bool(a = b); // -> true 37*c8dee2aaSAndroid Build Coastguard Worker if (a == b) { ++bad; } else { ++ok; } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker bool(a = b) || true; // -> unchanged 40*c8dee2aaSAndroid Build Coastguard Worker if (a == b) { ++ok; } else { ++bad; } 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker return ok == 22 && bad == 0; 43*c8dee2aaSAndroid Build Coastguard Worker} 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) { 46*c8dee2aaSAndroid Build Coastguard Worker return test() ? colorGreen : colorRed; 47*c8dee2aaSAndroid Build Coastguard Worker} 48