1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s 2 ; rdar://7527734 3 4 define i32 @test1(i32 %x) nounwind readnone ssp { 5 entry: 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 13 define 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 31 define void @test3(i32 %x, i32* %P) nounwind readnone ssp { 32 entry: 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 42 define i32 @test4(i32 %a, i32 %b) nounwind readnone ssp { 43 entry: 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 52 define void @test5(i32 %a, i32 %b, i32* nocapture %P) nounwind ssp { 53 entry: 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