void conditional_op(int x, int y, _Bool b, void *p) {
  (void)(x + someConditionFunc() ? 1 : 2);
  (void)((x + someConditionFunc()) ? 1 : 2);
  (void)(x - b ? 1 : 2);
  (void)(x * (x == y) ? 1 : 2);
  (void)(x / !x ? 1 : 2);
  (void)(x % 2 ? 1 : 2);
  (void)(x + p ? 1 : 2);
  (void)(p + x ? 1 : 2);
  (void)(p + b ? 1 : 2);
  (void)(x + y > 0 ? 1 : 2);
  (void)(x + (y > 0) ? 1 : 2);
  (void)(b ? 0xf0 : 0x10 | b ? 0x5 : 0x2);
  (void)((b ? 0xf0 : 0x10) | (b ? 0x5 : 0x2));
  (void)(b ? 0xf0 : (0x10 | b) ? 0x5 : 0x2);
  (void)(x | b ? 1 : 2);
  (void)(x & b ? 1 : 2);
  (void)((x | b) ? 1 : 2);
  (void)(x | (b ? 1 : 2));
  (void)((x & b) ? 1 : 2);
  (void)(x & (b ? 1 : 2));
  (void)(x ^ b ? 1 : 2);
  (void)(x || b ? 1 : 2);
  (void)(x && b ? 1 : 2);
}


x86 assembly (clang, -O0):
<conditional_op>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %dl,%al
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
and    $0x1,%al
mov    %al,-0x9(%rbp)
mov    %rcx,-0x18(%rbp)
mov    $0x0,%al
call   1030 <someConditionFunc@plt>
mov    $0x0,%al
call   1030 <someConditionFunc@plt>
testb  $0x1,-0x9(%rbp)
je     1146 <conditional_op+0x36>
jmp    1161 <conditional_op+0x51>
mov    -0x9(%rbp),%al
and    $0x1,%al
movzbl %al,%edx
or     $0x10,%edx
mov    $0x2,%eax
mov    $0x5,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
testb  $0x1,-0x9(%rbp)
je     1170 <conditional_op+0x60>
jmp    118b <conditional_op+0x7b>
mov    -0x9(%rbp),%al
and    $0x1,%al
movzbl %al,%edx
or     $0x10,%edx
mov    $0x2,%eax
mov    $0x5,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    $0x1,%al
cmpl   $0x0,-0x4(%rbp)
mov    %al,-0x19(%rbp)
jne    11a0 <conditional_op+0x90>
mov    -0x9(%rbp),%al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
xor    %eax,%eax
cmpl   $0x0,-0x4(%rbp)
mov    %al,-0x1a(%rbp)
je     11b8 <conditional_op+0xa8>
mov    -0x9(%rbp),%al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<conditional_op>:
push   %rax
xor    %eax,%eax
call   1030 <someConditionFunc@plt>
xor    %eax,%eax
pop    %rcx
jmp    1030 <someConditionFunc@plt>

LLVM IR (-O0):
define void @conditional_op(i32 %0, i32 %1, i1 zeroext %2, i8* %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i8
%8 = alloca i8*
store i32 %0, i32* %5
store i32 %1, i32* %6
%9 = zext i1 %2 to i8
store i8 %9, i8* %7
store i8* %3, i8** %8
%10 = load i32, i32* %5
%11 = call i32 (...) @someConditionFunc()
%12 = add nsw i32 %10, %11
%13 = icmp ne i32 %12, 0
%14 = zext i1 %13 to i64
%15 = select i1 %13, i32 1, i32 2
%16 = load i32, i32* %5
%17 = call i32 (...) @someConditionFunc()
%18 = add nsw i32 %16, %17
%19 = icmp ne i32 %18, 0
%20 = zext i1 %19 to i64
%21 = select i1 %19, i32 1, i32 2
%22 = load i32, i32* %5
%23 = load i8, i8* %7
%24 = trunc i8 %23 to i1
%25 = zext i1 %24 to i32
%26 = sub nsw i32 %22, %25
%27 = icmp ne i32 %26, 0
%28 = zext i1 %27 to i64
%29 = select i1 %27, i32 1, i32 2
%30 = load i32, i32* %5
%31 = load i32, i32* %5
%32 = load i32, i32* %6
%33 = icmp eq i32 %31, %32
%34 = zext i1 %33 to i32
%35 = mul nsw i32 %30, %34
%36 = icmp ne i32 %35, 0
%37 = zext i1 %36 to i64
%38 = select i1 %36, i32 1, i32 2
%39 = load i32, i32* %5
%40 = load i32, i32* %5
%41 = icmp ne i32 %40, 0
%42 = xor i1 %41, true
%43 = zext i1 %42 to i32
%44 = sdiv i32 %39, %43
%45 = icmp ne i32 %44, 0
%46 = zext i1 %45 to i64
%47 = select i1 %45, i32 1, i32 2
%48 = load i32, i32* %5
%49 = srem i32 %48, 2
%50 = icmp ne i32 %49, 0
%51 = zext i1 %50 to i64
%52 = select i1 %50, i32 1, i32 2
%53 = load i32, i32* %5
%54 = load i8*, i8** %8
%55 = sext i32 %53 to i64
%56 = getelementptr i8, i8* %54, i64 %55
%57 = icmp ne i8* %56, null
%58 = zext i1 %57 to i64
%59 = select i1 %57, i32 1, i32 2
%60 = load i8*, i8** %8
%61 = load i32, i32* %5
%62 = sext i32 %61 to i64
%63 = getelementptr i8, i8* %60, i64 %62
%64 = icmp ne i8* %63, null
%65 = zext i1 %64 to i64
%66 = select i1 %64, i32 1, i32 2
%67 = load i8*, i8** %8
%68 = load i8, i8* %7
%69 = trunc i8 %68 to i1
%70 = zext i1 %69 to i32
%71 = sext i32 %70 to i64
%72 = getelementptr i8, i8* %67, i64 %71
%73 = icmp ne i8* %72, null
%74 = zext i1 %73 to i64
%75 = select i1 %73, i32 1, i32 2
%76 = load i32, i32* %5
%77 = load i32, i32* %6
%78 = add nsw i32 %76, %77
%79 = icmp sgt i32 %78, 0
%80 = zext i1 %79 to i64
%81 = select i1 %79, i32 1, i32 2
%82 = load i32, i32* %5
%83 = load i32, i32* %6
%84 = icmp sgt i32 %83, 0
%85 = zext i1 %84 to i32
%86 = add nsw i32 %82, %85
%87 = icmp ne i32 %86, 0
%88 = zext i1 %87 to i64
%89 = select i1 %87, i32 1, i32 2
%90 = load i8, i8* %7
%91 = trunc i8 %90 to i1
br i1 %91, label %92, label %93
92: ; preds = %4
br label %101
93: ; preds = %4
%94 = load i8, i8* %7
%95 = trunc i8 %94 to i1
%96 = zext i1 %95 to i32
%97 = or i32 16, %96
%98 = icmp ne i32 %97, 0
%99 = zext i1 %98 to i64
%100 = select i1 %98, i32 5, i32 2
br label %101
101: ; preds = %93, %92
%102 = phi i32 [ 240, %92 ], [ %100, %93 ]
%103 = load i8, i8* %7
%104 = trunc i8 %103 to i1
%105 = zext i1 %104 to i64
%106 = select i1 %104, i32 240, i32 16
%107 = load i8, i8* %7
%108 = trunc i8 %107 to i1
%109 = zext i1 %108 to i64
%110 = select i1 %108, i32 5, i32 2
%111 = or i32 %106, %110
%112 = load i8, i8* %7
%113 = trunc i8 %112 to i1
br i1 %113, label %114, label %115
114: ; preds = %101
br label %123
115: ; preds = %101
%116 = load i8, i8* %7
%117 = trunc i8 %116 to i1
%118 = zext i1 %117 to i32
%119 = or i32 16, %118
%120 = icmp ne i32 %119, 0
%121 = zext i1 %120 to i64
%122 = select i1 %120, i32 5, i32 2
br label %123
123: ; preds = %115, %114
%124 = phi i32 [ 240, %114 ], [ %122, %115 ]
%125 = load i32, i32* %5
%126 = load i8, i8* %7
%127 = trunc i8 %126 to i1
%128 = zext i1 %127 to i32
%129 = or i32 %125, %128
%130 = icmp ne i32 %129, 0
%131 = zext i1 %130 to i64
%132 = select i1 %130, i32 1, i32 2
%133 = load i32, i32* %5
%134 = load i8, i8* %7
%135 = trunc i8 %134 to i1
%136 = zext i1 %135 to i32
%137 = and i32 %133, %136
%138 = icmp ne i32 %137, 0
%139 = zext i1 %138 to i64
%140 = select i1 %138, i32 1, i32 2
%141 = load i32, i32* %5
%142 = load i8, i8* %7
%143 = trunc i8 %142 to i1
%144 = zext i1 %143 to i32
%145 = or i32 %141, %144
%146 = icmp ne i32 %145, 0
%147 = zext i1 %146 to i64
%148 = select i1 %146, i32 1, i32 2
%149 = load i32, i32* %5
%150 = load i8, i8* %7
%151 = trunc i8 %150 to i1
%152 = zext i1 %151 to i64
%153 = select i1 %151, i32 1, i32 2
%154 = or i32 %149, %153
%155 = load i32, i32* %5
%156 = load i8, i8* %7
%157 = trunc i8 %156 to i1
%158 = zext i1 %157 to i32
%159 = and i32 %155, %158
%160 = icmp ne i32 %159, 0
%161 = zext i1 %160 to i64
%162 = select i1 %160, i32 1, i32 2
%163 = load i32, i32* %5
%164 = load i8, i8* %7
%165 = trunc i8 %164 to i1
%166 = zext i1 %165 to i64
%167 = select i1 %165, i32 1, i32 2
%168 = and i32 %163, %167
%169 = load i32, i32* %5
%170 = load i8, i8* %7
%171 = trunc i8 %170 to i1
%172 = zext i1 %171 to i32
%173 = xor i32 %169, %172
%174 = icmp ne i32 %173, 0
%175 = zext i1 %174 to i64
%176 = select i1 %174, i32 1, i32 2
%177 = load i32, i32* %5
%178 = icmp ne i32 %177, 0
br i1 %178, label %182, label %179
179: ; preds = %123
%180 = load i8, i8* %7
%181 = trunc i8 %180 to i1
br label %182
182: ; preds = %179, %123
%183 = phi i1 [ true, %123 ], [ %181, %179 ]
%184 = zext i1 %183 to i64
%185 = select i1 %183, i32 1, i32 2
%186 = load i32, i32* %5
%187 = icmp ne i32 %186, 0
br i1 %187, label %188, label %191
188: ; preds = %182
%189 = load i8, i8* %7
%190 = trunc i8 %189 to i1
br label %191
191: ; preds = %188, %182
%192 = phi i1 [ false, %182 ], [ %190, %188 ]
%193 = zext i1 %192 to i64
%194 = select i1 %192, i32 1, i32 2
ret void
}

LLVM IR (-O2):
define void @conditional_op(i32 %0, i32 %1, i1 zeroext %2, i8* nocapture readnone %3) {
%5 = tail call i32 (...) @someConditionFunc()
%6 = tail call i32 (...) @someConditionFunc()
ret void
}