1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-- | FileCheck %s
3
4; This tests some cases where BT must not be generated.  See also bt.ll.
5; Fixes 20040709-[12].c in gcc testsuite.
6
7define void @test2(i32 %x, i32 %n) nounwind {
8; CHECK-LABEL: test2:
9; CHECK:       # %bb.0: # %entry
10; CHECK-NEXT:    xorl %eax, %eax
11; CHECK-NEXT:    testb %al, %al
12; CHECK-NEXT:    jne .LBB0_2
13; CHECK-NEXT:  # %bb.1: # %bb
14; CHECK-NEXT:    calll foo
15; CHECK-NEXT:  .LBB0_2: # %UnifiedReturnBlock
16; CHECK-NEXT:    retl
17entry:
18        %tmp1 = and i32 %x, 1
19        %tmp2 = urem i32 %tmp1, 15
20	%tmp3 = and i32 %tmp2, 1		; <i32> [#uses=1]
21	%tmp4 = icmp eq i32 %tmp3, %tmp2	; <i1> [#uses=1]
22	br i1 %tmp4, label %bb, label %UnifiedReturnBlock
23
24bb:		; preds = %entry
25	call void @foo()
26	ret void
27
28UnifiedReturnBlock:		; preds = %entry
29	ret void
30}
31
32define void @test3(i32 %x, i32 %n) nounwind {
33; CHECK-LABEL: test3:
34; CHECK:       # %bb.0: # %entry
35; CHECK-NEXT:    xorl %eax, %eax
36; CHECK-NEXT:    testb %al, %al
37; CHECK-NEXT:    jne .LBB1_2
38; CHECK-NEXT:  # %bb.1: # %bb
39; CHECK-NEXT:    calll foo
40; CHECK-NEXT:  .LBB1_2: # %UnifiedReturnBlock
41; CHECK-NEXT:    retl
42entry:
43        %tmp1 = and i32 %x, 1
44        %tmp2 = urem i32 %tmp1, 15
45	%tmp3 = and i32 %tmp2, 1		; <i32> [#uses=1]
46	%tmp4 = icmp eq i32 %tmp2, %tmp3	; <i1> [#uses=1]
47	br i1 %tmp4, label %bb, label %UnifiedReturnBlock
48
49bb:		; preds = %entry
50	call void @foo()
51	ret void
52
53UnifiedReturnBlock:		; preds = %entry
54	ret void
55}
56
57define void @test4(i32 %x, i32 %n) nounwind {
58; CHECK-LABEL: test4:
59; CHECK:       # %bb.0: # %entry
60; CHECK-NEXT:    movb $1, %al
61; CHECK-NEXT:    testb %al, %al
62; CHECK-NEXT:    jne .LBB2_2
63; CHECK-NEXT:  # %bb.1: # %bb
64; CHECK-NEXT:    calll foo
65; CHECK-NEXT:  .LBB2_2: # %UnifiedReturnBlock
66; CHECK-NEXT:    retl
67entry:
68        %tmp1 = and i32 %x, 1
69        %tmp2 = urem i32 %tmp1, 15
70	%tmp3 = and i32 %tmp2, 1		; <i32> [#uses=1]
71	%tmp4 = icmp ne i32 %tmp2, %tmp3	; <i1> [#uses=1]
72	br i1 %tmp4, label %bb, label %UnifiedReturnBlock
73
74bb:		; preds = %entry
75	call void @foo()
76	ret void
77
78UnifiedReturnBlock:		; preds = %entry
79	ret void
80}
81
82define void @test5(i32 %x, i32 %n) nounwind {
83; CHECK-LABEL: test5:
84; CHECK:       # %bb.0: # %entry
85; CHECK-NEXT:    movb $1, %al
86; CHECK-NEXT:    testb %al, %al
87; CHECK-NEXT:    jne .LBB3_2
88; CHECK-NEXT:  # %bb.1: # %bb
89; CHECK-NEXT:    calll foo
90; CHECK-NEXT:  .LBB3_2: # %UnifiedReturnBlock
91; CHECK-NEXT:    retl
92entry:
93        %tmp1 = and i32 %x, 1
94        %tmp2 = urem i32 %tmp1, 15
95	%tmp3 = and i32 %tmp2, 1		; <i32> [#uses=1]
96	%tmp4 = icmp ne i32 %tmp2, %tmp3	; <i1> [#uses=1]
97	br i1 %tmp4, label %bb, label %UnifiedReturnBlock
98
99bb:		; preds = %entry
100	call void @foo()
101	ret void
102
103UnifiedReturnBlock:		; preds = %entry
104	ret void
105}
106
107declare void @foo()
108