Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -march=x86 | FileCheck %s
      2 
      3 ;; Simple case
      4 define i32 @test1(i8 %x) nounwind readnone {
      5   %A = and i8 %x, -32
      6   %B = zext i8 %A to i32
      7   ret i32 %B
      8 }
      9 ; CHECK: test1
     10 ; CHECK: movzbl
     11 ; CHECK-NEXT: andl {{.*}}224
     12 
     13 ;; Multiple uses of %x but easily extensible. 
     14 define i32 @test2(i8 %x) nounwind readnone {
     15   %A = and i8 %x, -32
     16   %B = zext i8 %A to i32
     17   %C = or i8 %x, 63
     18   %D = zext i8 %C to i32
     19   %E = add i32 %B, %D
     20   ret i32 %E
     21 }
     22 ; CHECK: test2
     23 ; CHECK: movzbl
     24 ; CHECK: orl $63
     25 ; CHECK: andl $224
     26 
     27 declare void @use(i32, i8)
     28 
     29 ;; Multiple uses of %x where we shouldn't extend the load.
     30 define void @test3(i8 %x) nounwind readnone {
     31   %A = and i8 %x, -32
     32   %B = zext i8 %A to i32
     33   call void @use(i32 %B, i8 %x)
     34   ret void
     35 }
     36 ; CHECK: test3
     37 ; CHECK: movzbl 16(%esp), [[REGISTER:%e[a-z]{2}]]
     38 ; CHECK-NEXT: movl [[REGISTER]], 4(%esp)
     39 ; CHECK-NEXT: andl $224, [[REGISTER]]
     40 ; CHECK-NEXT: movl [[REGISTER]], (%esp)
     41 ; CHECK-NEXT: call{{.*}}use
     42