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