Instruction scheduling itinerary for Intel Atom.
[oota-llvm.git] / test / CodeGen / X86 / zext-fold.ll
1 ; RUN: llc < %s -mcpu=generic -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 {{[0-9]+}}(%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