1; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
2; rdar://7527734
3
4define i32 @test1(i32 %x) nounwind readnone ssp {
5entry:
6; CHECK-LABEL: test1:
7; CHECK: leal 3(%rdi), %eax
8  %0 = shl i32 %x, 5                              ; <i32> [#uses=1]
9  %1 = or i32 %0, 3                               ; <i32> [#uses=1]
10  ret i32 %1
11}
12
13define i64 @test2(i8 %A, i8 %B) nounwind {
14; CHECK-LABEL: test2:
15; CHECK: shrq $4
16; CHECK-NOT: movq
17; CHECK-NOT: orq
18; CHECK: leaq
19; CHECK: ret
20  %C = zext i8 %A to i64                          ; <i64> [#uses=1]
21  %D = shl i64 %C, 4                              ; <i64> [#uses=1]
22  %E = and i64 %D, 48                             ; <i64> [#uses=1]
23  %F = zext i8 %B to i64                          ; <i64> [#uses=1]
24  %G = lshr i64 %F, 4                             ; <i64> [#uses=1]
25  %H = or i64 %G, %E                              ; <i64> [#uses=1]
26  ret i64 %H
27}
28
29;; Test that OR is only emitted as LEA, not as ADD.
30
31define void @test3(i32 %x, i32* %P) nounwind readnone ssp {
32entry:
33; No reason to emit an add here, should be an or.
34; CHECK-LABEL: test3:
35; CHECK: orl $3, %edi
36  %0 = shl i32 %x, 5
37  %1 = or i32 %0, 3
38  store i32 %1, i32* %P
39  ret void
40}
41
42define i32 @test4(i32 %a, i32 %b) nounwind readnone ssp {
43entry:
44  %and = and i32 %a, 6
45  %and2 = and i32 %b, 16
46  %or = or i32 %and2, %and
47  ret i32 %or
48; CHECK-LABEL: test4:
49; CHECK: leal	(%rsi,%rdi), %eax
50}
51
52define void @test5(i32 %a, i32 %b, i32* nocapture %P) nounwind ssp {
53entry:
54  %and = and i32 %a, 6
55  %and2 = and i32 %b, 16
56  %or = or i32 %and2, %and
57  store i32 %or, i32* %P, align 4
58  ret void
59; CHECK-LABEL: test5:
60; CHECK: orl
61}
62