<div dir="ltr"><div>Hi,</div><div><br></div><div>I would like to know if there's a way to avoid select instructions during the IR generation. What are the optimization passes that can result in a select instruction?</div><div>i.e. I want to preserve branches in my code without disabling any other optimizations applicable. <br></div><div><br></div><div>For example,</div><div>void foo(int* x, int* y){<br>    if(*x > 0){<br>        *y = *x + 10;<br>    }<br>    else{<br>        *y = *x + 20;<br>    }<br>}</div><div><br></div><div>with O1 I get,</div><div><br></div><div>define void @foo(i32* nocapture readonly, i32* nocapture) local_unnamed_addr #0 {<br>  %3 = load i32, i32* %0, align 4, !tbaa !2<br>  %4 = icmp sgt i32 %3, 0<br>  %5 = select i1 %4, i32 10, i32 20<br>  %6 = add nsw i32 %5, %3<br>  store i32 %6, i32* %1, align 4, !tbaa !2<br>  ret void<br>}</div><div><br></div><div>But with O0,</div><div><br></div><div>define void @foo(i32*, i32*) #0 {<br>  %3 = alloca i32*, align 8<br>  %4 = alloca i32*, align 8<br>  store i32* %0, i32** %3, align 8<br>  store i32* %1, i32** %4, align 8<br>  %5 = load i32*, i32** %3, align 8<br>  %6 = load i32, i32* %5, align 4<br>  %7 = icmp sgt i32 %6, 0<br>  br i1 %7, label %8, label %13<br><br>; <label>:8:                                      ; preds = %2<br>  %9 = load i32*, i32** %3, align 8<br>  %10 = load i32, i32* %9, align 4<br>  %11 = add nsw i32 %10, 10<br>  %12 = load i32*, i32** %4, align 8<br>  store i32 %11, i32* %12, align 4<br>  br label %18<br><br>; <label>:13:                                     ; preds = %2<br>  %14 = load i32*, i32** %3, align 8<br>  %15 = load i32, i32* %14, align 4<br>  %16 = add nsw i32 %15, 20<br>  %17 = load i32*, i32** %4, align 8<br>  store i32 %16, i32* %17, align 4<br>  br label %18<br><br>; <label>:18:                                     ; preds = %13, %8<br>  ret void<br>}<br></div><div><br></div><div>Thanks,</div><div>Charitha<br></div><div><br></div></div>