1; RUN: llc < %s -march=x86 | FileCheck %s 2 3;; Simple case 4define 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. 14define 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 27declare void @use(i32, i8) 28 29;; Multiple uses of %x where we shouldn't extend the load. 30define 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