; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s define i64 @test1(i8* %data) { ; CHECK-LABEL: test1: ; CHECK: movzbl ; CHECK-NEXT: shlq ; CHECK-NEXT: andl ; CHECK-NEXT: retq entry: %bf.load = load i8, i8* %data, align 4 %bf.clear = shl i8 %bf.load, 2 %0 = and i8 %bf.clear, 60 %mul = zext i8 %0 to i64 ret i64 %mul } define i8* @test2(i8* %data) { ; CHECK-LABEL: test2: ; CHECK: movzbl ; CHECK-NEXT: andl ; CHECK-NEXT: leaq ; CHECK-NEXT: retq entry: %bf.load = load i8, i8* %data, align 4 %bf.clear = shl i8 %bf.load, 2 %0 = and i8 %bf.clear, 60 %mul = zext i8 %0 to i64 %add.ptr = getelementptr inbounds i8, i8* %data, i64 %mul ret i8* %add.ptr } ; If the shift op is SHL, the logic op can only be AND. define i64 @test3(i8* %data) { ; CHECK-LABEL: test3: ; CHECK: movb ; CHECK-NEXT: shlb ; CHECK-NEXT: xorb ; CHECK-NEXT: movzbl ; CHECK-NEXT: retq entry: %bf.load = load i8, i8* %data, align 4 %bf.clear = shl i8 %bf.load, 2 %0 = xor i8 %bf.clear, 60 %mul = zext i8 %0 to i64 ret i64 %mul } define i64 @test4(i8* %data) { ; CHECK-LABEL: test4: ; CHECK: movzbl ; CHECK-NEXT: shrq ; CHECK-NEXT: andl ; CHECK-NEXT: retq entry: %bf.load = load i8, i8* %data, align 4 %bf.clear = lshr i8 %bf.load, 2 %0 = and i8 %bf.clear, 60 %1 = zext i8 %0 to i64 ret i64 %1 } define i64 @test5(i8* %data) { ; CHECK-LABEL: test5: ; CHECK: movzbl ; CHECK-NEXT: shrq ; CHECK-NEXT: xorq ; CHECK-NEXT: retq entry: %bf.load = load i8, i8* %data, align 4 %bf.clear = lshr i8 %bf.load, 2 %0 = xor i8 %bf.clear, 60 %1 = zext i8 %0 to i64 ret i64 %1 } define i64 @test6(i8* %data) { ; CHECK-LABEL: test6: ; CHECK: movzbl ; CHECK-NEXT: shrq ; CHECK-NEXT: orq ; CHECK-NEXT: retq entry: %bf.load = load i8, i8* %data, align 4 %bf.clear = lshr i8 %bf.load, 2 %0 = or i8 %bf.clear, 60 %1 = zext i8 %0 to i64 ret i64 %1 } ; Load is folded with sext. define i64 @test8(i8* %data) { ; CHECK-LABEL: test8: ; CHECK: movsbl ; CHECK-NEXT: movzwl ; CHECK-NEXT: shrl ; CHECK-NEXT: orl entry: %bf.load = load i8, i8* %data, align 4 %ext = sext i8 %bf.load to i16 %bf.clear = lshr i16 %ext, 2 %0 = or i16 %bf.clear, 60 %1 = zext i16 %0 to i64 ret i64 %1 }