blob: 912bdc215474ee2b90890489f1ab10548a9152f7 [file] [log] [blame]
Evan Cheng4b0345b2010-01-11 17:03:47 +00001; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
2; rdar://7527734
3
Chris Lattner15df55d2010-10-08 03:57:25 +00004define i32 @test1(i32 %x) nounwind readnone ssp {
Evan Cheng4b0345b2010-01-11 17:03:47 +00005entry:
Chris Lattner15df55d2010-10-08 03:57:25 +00006; CHECK: test1:
Evan Cheng4b0345b2010-01-11 17:03:47 +00007; 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}
Evan Cheng199c4242010-01-11 22:03:29 +000012
13define i64 @test2(i8 %A, i8 %B) nounwind {
14; CHECK: 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}
Chris Lattner15df55d2010-10-08 03:57:25 +000028
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: 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: 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: test5:
60; CHECK: orl
61}