131 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mcpu=generic -mtriple=i686-- -post-RA-scheduler=false | FileCheck %s3; rdar://72267974 5; LLVM should omit the testl and use the flags result from the orl.6 7define void @or(ptr %A, i32 %IA, i32 %N) nounwind {8; CHECK-LABEL: or:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax11; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx12; CHECK-NEXT: movl %eax, %edx13; CHECK-NEXT: andl $3, %edx14; CHECK-NEXT: xorl $1, %ecx15; CHECK-NEXT: orl %edx, %ecx16; CHECK-NEXT: je .LBB0_217; CHECK-NEXT: # %bb.1: # %bb18; CHECK-NEXT: movl $0, (%eax)19; CHECK-NEXT: .LBB0_2: # %return20; CHECK-NEXT: retl21entry:22 %0 = ptrtoint ptr %A to i32 ; <i32> [#uses=1]23 %1 = and i32 %0, 3 ; <i32> [#uses=1]24 %2 = xor i32 %IA, 1 ; <i32> [#uses=1]25 %3 = or i32 %2, %1 ; <i32> [#uses=1]26 %4 = icmp eq i32 %3, 0 ; <i1> [#uses=1]27 br i1 %4, label %return, label %bb28 29bb: ; preds = %entry30 store float 0.000000e+00, ptr %A, align 431 ret void32 33return: ; preds = %entry34 ret void35}36 37define void @xor(ptr %A, i32 %IA, i32 %N) nounwind {38; CHECK-LABEL: xor:39; CHECK: # %bb.0: # %entry40; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax41; CHECK-NEXT: movl %eax, %ecx42; CHECK-NEXT: andl $3, %ecx43; CHECK-NEXT: xorl {{[0-9]+}}(%esp), %ecx44; CHECK-NEXT: cmpl $1, %ecx45; CHECK-NEXT: je .LBB1_246; CHECK-NEXT: # %bb.1: # %bb47; CHECK-NEXT: movl $0, (%eax)48; CHECK-NEXT: .LBB1_2: # %return49; CHECK-NEXT: retl50entry:51 %0 = ptrtoint ptr %A to i32 ; <i32> [#uses=1]52 %1 = and i32 %0, 3 ; <i32> [#uses=1]53 %2 = xor i32 %IA, 1 ; <i32> [#uses=1]54 %3 = xor i32 %2, %1 ; <i32> [#uses=1]55 %4 = icmp eq i32 %3, 0 ; <i1> [#uses=1]56 br i1 %4, label %return, label %bb57 58bb: ; preds = %entry59 store float 0.000000e+00, ptr %A, align 460 ret void61 62return: ; preds = %entry63 ret void64}65 66define void @and(ptr %A, i32 %IA, i32 %N, ptr %p) nounwind {67; CHECK-LABEL: and:68; CHECK: # %bb.0: # %entry69; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx70; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax71; CHECK-NEXT: xorl $1, %eax72; CHECK-NEXT: andl {{[0-9]+}}(%esp), %eax73; CHECK-NEXT: andl $3, %eax74; CHECK-NEXT: movb %al, (%ecx)75; CHECK-NEXT: je .LBB2_276; CHECK-NEXT: # %bb.1: # %bb77; CHECK-NEXT: movl $0, 078; CHECK-NEXT: .LBB2_2: # %return79; CHECK-NEXT: retl80entry:81 store i8 0, ptr %p82 %0 = ptrtoint ptr %A to i32 ; <i32> [#uses=1]83 %1 = and i32 %0, 3 ; <i32> [#uses=1]84 %2 = xor i32 %IA, 1 ; <i32> [#uses=1]85 %3 = and i32 %2, %1 ; <i32> [#uses=1]86 %t = trunc i32 %3 to i887 store i8 %t, ptr %p88 %4 = icmp eq i32 %3, 0 ; <i1> [#uses=1]89 br i1 %4, label %return, label %bb90 91bb: ; preds = %entry92 store float 0.000000e+00, ptr null, align 493 ret void94 95return: ; preds = %entry96 ret void97}98 99; Just like @and, but without the trunc+store. This should use a testb100; instead of an andl.101define void @test(ptr %A, i32 %IA, i32 %N, ptr %p) nounwind {102; CHECK-LABEL: test:103; CHECK: # %bb.0: # %entry104; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax105; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx106; CHECK-NEXT: movb $0, (%ecx)107; CHECK-NEXT: xorl $1, %eax108; CHECK-NEXT: andl {{[0-9]+}}(%esp), %eax109; CHECK-NEXT: testb $3, %al110; CHECK-NEXT: je .LBB3_2111; CHECK-NEXT: # %bb.1: # %bb112; CHECK-NEXT: movl $0, 0113; CHECK-NEXT: .LBB3_2: # %return114; CHECK-NEXT: retl115entry:116 store i8 0, ptr %p117 %0 = ptrtoint ptr %A to i32 ; <i32> [#uses=1]118 %1 = and i32 %0, 3 ; <i32> [#uses=1]119 %2 = xor i32 %IA, 1 ; <i32> [#uses=1]120 %3 = and i32 %2, %1 ; <i32> [#uses=1]121 %4 = icmp eq i32 %3, 0 ; <i1> [#uses=1]122 br i1 %4, label %return, label %bb123 124bb: ; preds = %entry125 store float 0.000000e+00, ptr null, align 4126 ret void127 128return: ; preds = %entry129 ret void130}131