1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -mtriple=x86_64-unknown-linux-gnu -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; Checks that the select-icmp optimization is safe in two cases 3*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32) 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @bar(i32) 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; don't replace 'cond' by 'len' in the home block ('bb') that 7*9880d681SAndroid Build Coastguard Worker; contains the select 8*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 %len) { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker br label %bb 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerbb: 13*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %len, 8 14*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %len, i32 8 15*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %cond) 16*9880d681SAndroid Build Coastguard Worker %cmp11 = icmp eq i32 %cond, 8 17*9880d681SAndroid Build Coastguard Worker br i1 %cmp11, label %for.end, label %bb 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerfor.end: 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker; CHECK: select 22*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 %cond, 8 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; don't replace 'cond' by 'len' in a block ('b1') that dominates all uses 26*9880d681SAndroid Build Coastguard Worker; of the select outside the home block ('bb'), but can be reached from the home 27*9880d681SAndroid Build Coastguard Worker; block on another path ('bb -> b0 -> b1') 28*9880d681SAndroid Build Coastguard Workerdefine void @test2(i32 %len) { 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker %0 = call i32 @bar(i32 %len); 31*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %len, 4 32*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb, label %b1 33*9880d681SAndroid Build Coastguard Workerbb: 34*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ult i32 %0, 2 35*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp2, i32 %len, i32 8 36*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp eq i32 %cond, 8 37*9880d681SAndroid Build Coastguard Worker br i1 %cmp3, label %b0, label %b1 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerb0: 40*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %len) 41*9880d681SAndroid Build Coastguard Worker br label %b1 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerb1: 44*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 [ %cond, %bb ], [ undef, %b0 ], [ %0, %entry ] 45*9880d681SAndroid Build Coastguard Worker %1 = phi i32 [ %cond, %bb ], [ undef, %b0 ], [ %0, %entry ] 46*9880d681SAndroid Build Coastguard Worker br label %ret 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerret: 49*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %1) 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52