1; RUN: opt < %s -instcombine -S | FileCheck %s
2
3
4define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
5  %e = icmp slt i32 %a, %b
6  %f = sext i1 %e to i32
7  %g = and i32 %c, %f
8  %h = xor i32 %f, -1
9  %i = and i32 %d, %h
10  %j = or i32 %g, %i
11  ret i32 %j
12; CHECK: %e = icmp slt i32 %a, %b
13; CHECK-NEXT: [[result:%.*]] = select i1 %e, i32 %c, i32 %d
14; CHECK-NEXT: ret i32 [[result]]
15}
16define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
17  %e = icmp slt i32 %a, %b
18  %f = sext i1 %e to i32
19  %g = and i32 %c, %f
20  %h = xor i32 %f, -1
21  %i = and i32 %d, %h
22  %j = or i32 %i, %g
23  ret i32 %j
24; CHECK: %e = icmp slt i32 %a, %b
25; CHECK-NEXT: [[result:%.*]] = select i1 %e, i32 %c, i32 %d
26; CHECK-NEXT: ret i32 [[result]]
27}
28
29define i32 @goo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
30entry:
31  %0 = icmp slt i32 %a, %b
32  %iftmp.0.0 = select i1 %0, i32 -1, i32 0
33  %1 = and i32 %iftmp.0.0, %c
34  %not = xor i32 %iftmp.0.0, -1
35  %2 = and i32 %not, %d
36  %3 = or i32 %1, %2
37  ret i32 %3
38; CHECK: %0 = icmp slt i32 %a, %b
39; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d
40; CHECK-NEXT: ret i32 [[result]]
41}
42define i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
43entry:
44  %0 = icmp slt i32 %a, %b
45  %iftmp.0.0 = select i1 %0, i32 -1, i32 0
46  %1 = and i32 %iftmp.0.0, %c
47  %iftmp = select i1 %0, i32 0, i32 -1
48  %2 = and i32 %iftmp, %d
49  %3 = or i32 %1, %2
50  ret i32 %3
51; CHECK: %0 = icmp slt i32 %a, %b
52; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d
53; CHECK-NEXT: ret i32 [[result]]
54}
55
56define i32 @par(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
57entry:
58  %0 = icmp slt i32 %a, %b
59  %iftmp.1.0 = select i1 %0, i32 -1, i32 0
60  %1 = and i32 %iftmp.1.0, %c
61  %not = xor i32 %iftmp.1.0, -1
62  %2 = and i32 %not, %d
63  %3 = or i32 %1, %2
64  ret i32 %3
65; CHECK: %0 = icmp slt i32 %a, %b
66; CHECK-NEXT: [[result:%.*]] = select i1 %0, i32 %c, i32 %d
67; CHECK-NEXT: ret i32 [[result]]
68}
69