07a326b47f08f037fdf28aca2e5f0b990f8349fd
[oota-llvm.git] / test / Transforms / InstCombine / logical-select.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2
3
4 define 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: %g = select i1 %e, i32 %c, i32 0
14 ; CHECK-NEXT: %i = select i1 %e, i32 0, i32 %d
15 ; CHECK-NEXT: %j = or i32 %g, %i
16 ; CHECK-NEXT: ret i32 %j
17 }
18 define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
19   %e = icmp slt i32 %a, %b
20   %f = sext i1 %e to i32
21   %g = and i32 %c, %f
22   %h = xor i32 %f, -1
23   %i = and i32 %d, %h
24   %j = or i32 %i, %g
25   ret i32 %j
26 ; CHECK: %e = icmp slt i32 %a, %b
27 ; CHECK-NEXT: %g = select i1 %e, i32 %c, i32 0
28 ; CHECK-NEXT: %i = select i1 %e, i32 0, i32 %d
29 ; CHECK-NEXT: %j = or i32 %i, %g
30 ; CHECK-NEXT: ret i32 %j
31 }
32
33 define i32 @goo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
34 entry:
35   %0 = icmp slt i32 %a, %b
36   %iftmp.0.0 = select i1 %0, i32 -1, i32 0
37   %1 = and i32 %iftmp.0.0, %c
38   %not = xor i32 %iftmp.0.0, -1
39   %2 = and i32 %not, %d
40   %3 = or i32 %1, %2
41   ret i32 %3
42 ; CHECK: %0 = icmp slt i32 %a, %b
43 ; CHECK-NEXT: %1 = select i1 %0, i32 %c, i32 0
44 ; CHECK-NEXT: %2 = select i1 %0, i32 0, i32 %d
45 ; CHECK-NEXT: %3 = or i32 %1, %2
46 ; CHECK-NEXT: ret i32 %3
47 }
48 define i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
49 entry:
50   %0 = icmp slt i32 %a, %b
51   %iftmp.0.0 = select i1 %0, i32 -1, i32 0
52   %1 = and i32 %iftmp.0.0, %c
53   %iftmp = select i1 %0, i32 0, i32 -1
54   %2 = and i32 %iftmp, %d
55   %3 = or i32 %1, %2
56   ret i32 %3
57 ; CHECK: %0 = icmp slt i32 %a, %b
58 ; CHECK-NEXT: %1 = select i1 %0, i32 %c, i32 0
59 ; CHECK-NEXT: %2 = select i1 %0, i32 0, i32 %d
60 ; CHECK-NEXT: %3 = or i32 %1, %2
61 ; CHECK-NEXT: ret i32 %3
62 }
63
64 define i32 @par(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
65 entry:
66   %0 = icmp slt i32 %a, %b
67   %iftmp.1.0 = select i1 %0, i32 -1, i32 0
68   %1 = and i32 %iftmp.1.0, %c
69   %not = xor i32 %iftmp.1.0, -1
70   %2 = and i32 %not, %d
71   %3 = or i32 %1, %2
72   ret i32 %3
73 ; CHECK: %0 = icmp slt i32 %a, %b
74 ; CHECK-NEXT: %1 = select i1 %0, i32 %c, i32 0
75 ; CHECK-NEXT: %2 = select i1 %0, i32 0, i32 %d
76 ; CHECK-NEXT: %3 = or i32 %1, %2
77 ; CHECK-NEXT: ret i32 %3
78 }