Home | History | Annotate | Download | only in X86
      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