| ; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s | 
 | ; rdar://7527734 | 
 |  | 
 | define i32 @test1(i32 %x) nounwind readnone ssp { | 
 | entry: | 
 | ; CHECK: test1: | 
 | ; CHECK: leal 3(%rdi), %eax | 
 |   %0 = shl i32 %x, 5                              ; <i32> [#uses=1] | 
 |   %1 = or i32 %0, 3                               ; <i32> [#uses=1] | 
 |   ret i32 %1 | 
 | } | 
 |  | 
 | define i64 @test2(i8 %A, i8 %B) nounwind { | 
 | ; CHECK: test2: | 
 | ; CHECK: shrq $4 | 
 | ; CHECK-NOT: movq | 
 | ; CHECK-NOT: orq | 
 | ; CHECK: leaq | 
 | ; CHECK: ret | 
 |   %C = zext i8 %A to i64                          ; <i64> [#uses=1] | 
 |   %D = shl i64 %C, 4                              ; <i64> [#uses=1] | 
 |   %E = and i64 %D, 48                             ; <i64> [#uses=1] | 
 |   %F = zext i8 %B to i64                          ; <i64> [#uses=1] | 
 |   %G = lshr i64 %F, 4                             ; <i64> [#uses=1] | 
 |   %H = or i64 %G, %E                              ; <i64> [#uses=1] | 
 |   ret i64 %H | 
 | } | 
 |  | 
 | ;; Test that OR is only emitted as LEA, not as ADD. | 
 |  | 
 | define void @test3(i32 %x, i32* %P) nounwind readnone ssp { | 
 | entry: | 
 | ; No reason to emit an add here, should be an or. | 
 | ; CHECK: test3: | 
 | ; CHECK: orl $3, %edi | 
 |   %0 = shl i32 %x, 5 | 
 |   %1 = or i32 %0, 3 | 
 |   store i32 %1, i32* %P | 
 |   ret void | 
 | } | 
 |  | 
 | define i32 @test4(i32 %a, i32 %b) nounwind readnone ssp { | 
 | entry: | 
 |   %and = and i32 %a, 6 | 
 |   %and2 = and i32 %b, 16 | 
 |   %or = or i32 %and2, %and | 
 |   ret i32 %or | 
 | ; CHECK: test4: | 
 | ; CHECK: leal	(%rsi,%rdi), %eax | 
 | } | 
 |  | 
 | define void @test5(i32 %a, i32 %b, i32* nocapture %P) nounwind ssp { | 
 | entry: | 
 |   %and = and i32 %a, 6 | 
 |   %and2 = and i32 %b, 16 | 
 |   %or = or i32 %and2, %and | 
 |   store i32 %or, i32* %P, align 4 | 
 |   ret void | 
 | ; CHECK: test5: | 
 | ; CHECK: orl | 
 | } |