Re-implement the main strength-reduction portion of LoopStrengthReduction.
[oota-llvm.git] / test / CodeGen / X86 / 2009-03-11-CoalescerBug.ll
1 ; RUN: llc < %s -mtriple=i386-apple-darwin9 -stats |& grep regcoalescing | grep commuting
2
3 @lookupTable5B = external global [64 x i32], align 32           ; <[64 x i32]*> [#uses=1]
4 @lookupTable3B = external global [16 x i32], align 32           ; <[16 x i32]*> [#uses=1]
5 @disparity0 = external global i32               ; <i32*> [#uses=5]
6 @disparity1 = external global i32               ; <i32*> [#uses=3]
7
8 define i32 @calc(i32 %theWord, i32 %k) nounwind {
9 entry:
10         %0 = lshr i32 %theWord, 3               ; <i32> [#uses=1]
11         %1 = and i32 %0, 31             ; <i32> [#uses=1]
12         %2 = shl i32 %k, 5              ; <i32> [#uses=1]
13         %3 = or i32 %1, %2              ; <i32> [#uses=1]
14         %4 = and i32 %theWord, 7                ; <i32> [#uses=1]
15         %5 = shl i32 %k, 3              ; <i32> [#uses=1]
16         %6 = or i32 %5, %4              ; <i32> [#uses=1]
17         %7 = getelementptr [64 x i32]* @lookupTable5B, i32 0, i32 %3            ; <i32*> [#uses=1]
18         %8 = load i32* %7, align 4              ; <i32> [#uses=5]
19         %9 = getelementptr [16 x i32]* @lookupTable3B, i32 0, i32 %6            ; <i32*> [#uses=1]
20         %10 = load i32* %9, align 4             ; <i32> [#uses=5]
21         %11 = and i32 %8, 65536         ; <i32> [#uses=1]
22         %12 = icmp eq i32 %11, 0                ; <i1> [#uses=1]
23         br i1 %12, label %bb1, label %bb
24
25 bb:             ; preds = %entry
26         %13 = and i32 %8, 994           ; <i32> [#uses=1]
27         %14 = load i32* @disparity0, align 4            ; <i32> [#uses=2]
28         store i32 %14, i32* @disparity1, align 4
29         br label %bb8
30
31 bb1:            ; preds = %entry
32         %15 = lshr i32 %8, 18           ; <i32> [#uses=1]
33         %16 = and i32 %15, 1            ; <i32> [#uses=1]
34         %17 = load i32* @disparity0, align 4            ; <i32> [#uses=4]
35         %18 = icmp eq i32 %16, %17              ; <i1> [#uses=1]
36         %not = select i1 %18, i32 0, i32 994            ; <i32> [#uses=1]
37         %.masked = and i32 %8, 994              ; <i32> [#uses=1]
38         %result.1 = xor i32 %not, %.masked              ; <i32> [#uses=2]
39         %19 = and i32 %8, 524288                ; <i32> [#uses=1]
40         %20 = icmp eq i32 %19, 0                ; <i1> [#uses=1]
41         br i1 %20, label %bb7, label %bb6
42
43 bb6:            ; preds = %bb1
44         %21 = xor i32 %17, 1            ; <i32> [#uses=2]
45         store i32 %21, i32* @disparity1, align 4
46         br label %bb8
47
48 bb7:            ; preds = %bb1
49         store i32 %17, i32* @disparity1, align 4
50         br label %bb8
51
52 bb8:            ; preds = %bb7, %bb6, %bb
53         %22 = phi i32 [ %17, %bb7 ], [ %21, %bb6 ], [ %14, %bb ]                ; <i32> [#uses=4]
54         %result.0 = phi i32 [ %result.1, %bb7 ], [ %result.1, %bb6 ], [ %13, %bb ]              ; <i32> [#uses=2]
55         %23 = and i32 %10, 65536                ; <i32> [#uses=1]
56         %24 = icmp eq i32 %23, 0                ; <i1> [#uses=1]
57         br i1 %24, label %bb10, label %bb9
58
59 bb9:            ; preds = %bb8
60         %25 = and i32 %10, 29           ; <i32> [#uses=1]
61         %26 = or i32 %result.0, %25             ; <i32> [#uses=1]
62         store i32 %22, i32* @disparity0, align 4
63         ret i32 %26
64
65 bb10:           ; preds = %bb8
66         %27 = lshr i32 %10, 18          ; <i32> [#uses=1]
67         %28 = and i32 %27, 1            ; <i32> [#uses=1]
68         %29 = icmp eq i32 %28, %22              ; <i1> [#uses=1]
69         %not13 = select i1 %29, i32 0, i32 29           ; <i32> [#uses=1]
70         %.masked20 = and i32 %10, 29            ; <i32> [#uses=1]
71         %.pn = xor i32 %not13, %.masked20               ; <i32> [#uses=1]
72         %result.3 = or i32 %.pn, %result.0              ; <i32> [#uses=2]
73         %30 = and i32 %10, 524288               ; <i32> [#uses=1]
74         %31 = icmp eq i32 %30, 0                ; <i1> [#uses=1]
75         br i1 %31, label %bb17, label %bb16
76
77 bb16:           ; preds = %bb10
78         %32 = xor i32 %22, 1            ; <i32> [#uses=1]
79         store i32 %32, i32* @disparity0, align 4
80         ret i32 %result.3
81
82 bb17:           ; preds = %bb10
83         store i32 %22, i32* @disparity0, align 4
84         ret i32 %result.3
85 }