<div dir="ltr">Hello again!<div><br></div><div>I took a stab at PR4898[1]. The attached patch improves Clang's <font face="monospace">__builtin_constant_p</font> support so that the Linux kernel is happy. With this improvement, Clang can determine if <font face="monospace">__builtin_constant_p</font> is true or false after inlining.</div><div><br></div><div>As an example:</div><div><br></div><div><div><font face="monospace">static __attribute__((always_inline)) int foo(int x) {</font></div><div><font face="monospace"><span style="white-space:pre">   </span>if (__builtin_constant_p(x))</font></div><div><font face="monospace"><span style="white-space:pre">              </span>return 1;</font></div><div><font face="monospace"><span style="white-space:pre"> </span>return 0;</font></div><div><font face="monospace">}</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">static __attribute__((always_inline)) int mux() {</font></div><div><font face="monospace"><span style="white-space:pre">    </span>if (__builtin_constant_p(37))</font></div><div><font face="monospace"><span style="white-space:pre">             </span>return 927;</font></div><div><font face="monospace"><span style="white-space:pre">       </span>return 0;</font></div><div><font face="monospace">}</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">int bar(int a) {</font></div><div><font face="monospace"><span style="white-space:pre">     </span>if (a)</font></div><div><font face="monospace"><span style="white-space:pre">            </span>return foo(42);</font></div><div><font face="monospace"><span style="white-space:pre">   </span>else</font></div><div><font face="monospace"><span style="white-space:pre">              </span>return mux();</font></div><div><font face="monospace">}</font></div></div><div><br></div><div>Now outputs this code at -O1:</div><div><br></div><div><font face="monospace">bar:</font></div><div><div><font face="monospace"><span style="white-space:pre">     </span>.cfi_startproc</font></div><div><font face="monospace"># %bb.0:                                # %entry</font></div><div><font face="monospace"><span style="white-space:pre"> </span>testl<span style="white-space:pre">        </span>%edi, %edi</font></div><div><font face="monospace"><span style="white-space:pre">        </span>movl<span style="white-space:pre"> </span>$927, %ecx              # imm = 0x39F</font></div><div><font face="monospace"><span style="white-space:pre">      </span>movl<span style="white-space:pre"> </span>$1, %eax</font></div><div><font face="monospace"><span style="white-space:pre">  </span>cmovel<span style="white-space:pre">       </span>%ecx, %eax</font></div><div><font face="monospace"><span style="white-space:pre">        </span>retq</font></div></div><div><br></div><div>And this code at -O0:</div><div><br></div><div><div><font face="monospace">bar:                                    # @bar</font></div><div><font face="monospace"><span style="white-space:pre">      </span>.cfi_startproc</font></div><div><font face="monospace"># %bb.0:                                # %entry</font></div><div><font face="monospace"><span style="white-space:pre"> </span>pushq<span style="white-space:pre">        </span>%rbp</font></div><div><font face="monospace"><span style="white-space:pre">      </span>.cfi_def_cfa_offset 16</font></div><div><font face="monospace"><span style="white-space:pre">    </span>.cfi_offset %rbp, -16</font></div><div><font face="monospace"><span style="white-space:pre">     </span>movq<span style="white-space:pre"> </span>%rsp, %rbp</font></div><div><font face="monospace"><span style="white-space:pre">        </span>.cfi_def_cfa_register %rbp</font></div><div><font face="monospace"><span style="white-space:pre">        </span>movl<span style="white-space:pre"> </span>%edi, -16(%rbp)</font></div><div><font face="monospace"><span style="white-space:pre">   </span>cmpl<span style="white-space:pre"> </span>$0, -16(%rbp)</font></div><div><font face="monospace"><span style="white-space:pre">     </span>je<span style="white-space:pre">   </span>.LBB0_2</font></div><div><font face="monospace"># %bb.1:                                # %if.then</font></div><div><font face="monospace"><span style="white-space:pre">      </span>movl<span style="white-space:pre"> </span>$42, -8(%rbp)</font></div><div><font face="monospace"><span style="white-space:pre">     </span>movl<span style="white-space:pre"> </span>$0, -4(%rbp)</font></div><div><font face="monospace"><span style="white-space:pre">      </span>movl<span style="white-space:pre"> </span>-4(%rbp), %eax</font></div><div><font face="monospace"><span style="white-space:pre">    </span>movl<span style="white-space:pre"> </span>%eax, -12(%rbp)</font></div><div><font face="monospace"><span style="white-space:pre">   </span>jmp<span style="white-space:pre">  </span>.LBB0_3</font></div><div><font face="monospace">.LBB0_2:                                # %if.else</font></div><div><font face="monospace"><span style="white-space:pre">      </span>movl<span style="white-space:pre"> </span>$927, -12(%rbp)         # imm = 0x39F</font></div><div><font face="monospace">.LBB0_3:                                # %return</font></div><div><font face="monospace"><span style="white-space:pre">    </span>movl<span style="white-space:pre"> </span>-12(%rbp), %eax</font></div><div><font face="monospace"><span style="white-space:pre">   </span>popq<span style="white-space:pre"> </span>%rbp</font></div><div><font face="monospace"><span style="white-space:pre">      </span>retq</font></div></div><div><br></div><div>If the patch looks okay to people, I can shove it onto Phabricator for a review. (My phab-fu is bad.)</div><div><br></div><div>Thoughts?</div><div><br></div><div>-bw</div><div><br></div><div>[1] <a href="https://bugs.llvm.org/show_bug.cgi?id=4898">https://bugs.llvm.org/show_bug.cgi?id=4898</a></div></div>