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