xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/pr21210.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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