1; RUN: llc < %s -mcpu=generic -march=x86 -post-RA-scheduler=false | FileCheck %s
2; rdar://7226797
3
4; LLVM should omit the testl and use the flags result from the orl.
5
6; CHECK-LABEL: or:
7define void @or(float* %A, i32 %IA, i32 %N) nounwind {
8entry:
9  %0 = ptrtoint float* %A to i32                  ; <i32> [#uses=1]
10  %1 = and i32 %0, 3                              ; <i32> [#uses=1]
11  %2 = xor i32 %IA, 1                             ; <i32> [#uses=1]
12; CHECK:      orl %e
13; CHECK-NEXT: je
14  %3 = or i32 %2, %1                              ; <i32> [#uses=1]
15  %4 = icmp eq i32 %3, 0                          ; <i1> [#uses=1]
16  br i1 %4, label %return, label %bb
17
18bb:                                               ; preds = %entry
19  store float 0.000000e+00, float* %A, align 4
20  ret void
21
22return:                                           ; preds = %entry
23  ret void
24}
25; CHECK-LABEL: xor:
26define void @xor(float* %A, i32 %IA, i32 %N) nounwind {
27entry:
28  %0 = ptrtoint float* %A to i32                  ; <i32> [#uses=1]
29  %1 = and i32 %0, 3                              ; <i32> [#uses=1]
30; CHECK:      xorl $1, %e
31; CHECK-NEXT: je
32  %2 = xor i32 %IA, 1                             ; <i32> [#uses=1]
33  %3 = xor i32 %2, %1                              ; <i32> [#uses=1]
34  %4 = icmp eq i32 %3, 0                          ; <i1> [#uses=1]
35  br i1 %4, label %return, label %bb
36
37bb:                                               ; preds = %entry
38  store float 0.000000e+00, float* %A, align 4
39  ret void
40
41return:                                           ; preds = %entry
42  ret void
43}
44; CHECK-LABEL: and:
45define void @and(float* %A, i32 %IA, i32 %N, i8* %p) nounwind {
46entry:
47  store i8 0, i8* %p
48  %0 = ptrtoint float* %A to i32                  ; <i32> [#uses=1]
49  %1 = and i32 %0, 3                              ; <i32> [#uses=1]
50  %2 = xor i32 %IA, 1                             ; <i32> [#uses=1]
51; CHECK:      andl  $3, %
52; CHECK-NEXT: movb  %
53; CHECK-NEXT: je
54  %3 = and i32 %2, %1                              ; <i32> [#uses=1]
55  %t = trunc i32 %3 to i8
56  store i8 %t, i8* %p
57  %4 = icmp eq i32 %3, 0                          ; <i1> [#uses=1]
58  br i1 %4, label %return, label %bb
59
60bb:                                               ; preds = %entry
61  store float 0.000000e+00, float* null, align 4
62  ret void
63
64return:                                           ; preds = %entry
65  ret void
66}
67
68; Just like @and, but without the trunc+store. This should use a testb
69; instead of an andl.
70; CHECK-LABEL: test:
71define void @test(float* %A, i32 %IA, i32 %N, i8* %p) nounwind {
72entry:
73  store i8 0, i8* %p
74  %0 = ptrtoint float* %A to i32                  ; <i32> [#uses=1]
75  %1 = and i32 %0, 3                              ; <i32> [#uses=1]
76  %2 = xor i32 %IA, 1                             ; <i32> [#uses=1]
77; CHECK:      testb $3, %
78; CHECK-NEXT: je
79  %3 = and i32 %2, %1                              ; <i32> [#uses=1]
80  %4 = icmp eq i32 %3, 0                          ; <i1> [#uses=1]
81  br i1 %4, label %return, label %bb
82
83bb:                                               ; preds = %entry
84  store float 0.000000e+00, float* null, align 4
85  ret void
86
87return:                                           ; preds = %entry
88  ret void
89}
90