<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>Simple Example:<br><br>int main()</div><div>{</div><div>  int x;</div><div>  if (x || 1) {}</div><div>}</div><div><br></div><div>Clang can not evaluate this condition and will emit IR like this:</div><div><br></div><div>define signext i32 @main() #0 {</div><div>entry:</div><div>  %retval = alloca i32, align 4</div><div>  %x = alloca i32, align 4</div><div>  store i32 0, i32* %retval, align 4</div><div>  %0 = load i32, i32* %x, align 4</div><div>  %tobool = icmp ne i32 %0, 0</div><div>  br i1 %tobool, label %if.then, label %lor.lhs.false</div><div><br></div><div>lor.lhs.false:                                    ; preds = %entry</div><div>  br i1 true, label %if.then, label %if.end</div><div><br></div><div>if.then:                                          ; preds = %lor.lhs.false, %entry</div><div>  br label %if.end</div><div><br></div><div>if.end:                                           ; preds = %if.then, %lor.lhs.false</div><div>  %1 = load i32, i32* %retval, align 4</div><div>  ret i32 %1</div><div>}</div><div><br></div><div>However, when we swap the position of LHS and RHS(i.e. if (1 || x), Clang can recognize it:</div><div><br></div><div>define signext i32 @main() #0 {</div><div>entry:</div><div>  %x = alloca i32, align 4</div><div>  ret i32 0</div><div>}<br><br>I also find the root issue and propose one potential solution in comment 2 of this link: <a href="https://bugs.llvm.org/show_bug.cgi?id=34229" _src="https://bugs.llvm.org/show_bug.cgi?id=34229">https://bugs.llvm.org/show_bug.cgi?id=34229</a><br> <br>Any idea?<br><br>Thanks in advance.</div></div><br><br><span title="neteasefooter"><p> </p></span>