; Simple test of non-fused compare/branch. ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \ ; RUN: -allow-externally-defined-symbols | FileCheck %s ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \ ; RUN: -allow-externally-defined-symbols | FileCheck --check-prefix=OPTM1 %s define internal void @icmpEqZero64() { entry: %cmp = icmp eq i64 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry call void @func() br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpEqZero64 ; CHECK: or ; CHECK-NOT: set ; OPTM1-LABEL: icmpEqZero64 ; OPTM1: or ; OPTM1-NEXT: sete define internal void @icmpNeZero64() { entry: %cmp = icmp ne i64 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry call void @func() br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpNeZero64 ; CHECK: or ; CHECK-NOT: set ; OPTM1-LABEL: icmpNeZero64 ; OPTM1: or ; OPTM1-NEXT: setne define internal void @icmpSgeZero64() { entry: %cmp = icmp sge i64 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry call void @func() br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpSgeZero64 ; CHECK: test eax,0x80000000 ; CHECK-NOT: sete ; OPTM1-LABEL: icmpSgeZero64 ; OPTM1: test eax,0x80000000 ; OPTM1-NEXT: sete define internal void @icmpSltZero64() { entry: %cmp = icmp slt i64 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry call void @func() br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpSltZero64 ; CHECK: test eax,0x80000000 ; CHECK-NOT: setne ; OPTM1-LABEL: icmpSltZero64 ; OPTM1: test eax,0x80000000 ; OPTM1-NEXT: setne define internal void @icmpUltZero64() { entry: %cmp = icmp ult i64 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry call void @func() br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpUltZero64 ; CHECK: mov [[RESULT:.*]],0x0 ; CHECK-NEXT: cmp [[RESULT]],0x0 ; OPTM1-LABEL: icmpUltZero64 ; OPTM1: mov [[RESULT:.*]],0x0 ; OPTM1-NEXT: cmp [[RESULT]],0x0 define internal void @icmpUgeZero64() { entry: %cmp = icmp uge i64 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry call void @func() br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpUgeZero64 ; CHECK: mov [[RESULT:.*]],0x1 ; CHECK-NEXT: cmp [[RESULT]],0x0 ; OPTM1-LABEL: icmpUgeZero64 ; OPTM1: mov [[RESULT:.*]],0x1 ; OPTM1-NEXT: cmp [[RESULT]],0x0 define internal void @icmpUltZero32() { entry: %cmp = icmp ult i32 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry %cmp_ext = zext i1 %cmp to i32 call void @use(i32 %cmp_ext) br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpUltZero32 ; CHECK: mov [[RESULT:.*]],0x0 ; CHECK-NEXT: cmp [[RESULT]],0x0 ; OPTM1-LABEL: icmpUltZero32 ; OPTM1: mov [[RESULT:.*]],0x0 ; OPTM1: cmp [[RESULT]],0x0 define internal void @icmpUgeZero32() { entry: %cmp = icmp uge i32 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry %cmp_ext = zext i1 %cmp to i32 call void @use(i32 %cmp_ext) br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpUgeZero32 ; CHECK: mov [[RESULT:.*]],0x1 ; CHECK-NEXT: cmp [[RESULT]],0x0 ; OPTM1-LABEL: icmpUgeZero32 ; OPTM1: mov [[RESULT:.*]],0x1 ; OPTM1-NEXT: cmp [[RESULT]],0x0 define internal void @icmpUltZero16() { entry: %cmp = icmp ult i16 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry %cmp_ext = zext i1 %cmp to i32 call void @use(i32 %cmp_ext) br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpUltZero16 ; CHECK: mov [[RESULT:.*]],0x0 ; CHECK-NEXT: cmp [[RESULT]],0x0 ; OPTM1-LABEL: icmpUltZero16 ; OPTM1: mov [[RESULT:.*]],0x0 ; OPTM1-NEXT: cmp [[RESULT]],0x0 define internal void @icmpUgeZero16() { entry: %cmp = icmp uge i16 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry %cmp_ext = zext i1 %cmp to i32 call void @use(i32 %cmp_ext) br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpUgeZero16 ; CHECK: mov [[RESULT:.*]],0x1 ; CHECK-NEXT: cmp [[RESULT]],0x0 ; OPTM1-LABEL: icmpUgeZero16 ; OPTM1: mov [[RESULT:.*]],0x1 ; OPTM1-NEXT: cmp [[RESULT]],0x0 define internal void @icmpUltZero8() { entry: %cmp = icmp ult i8 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry %cmp_ext = zext i1 %cmp to i32 call void @use(i32 %cmp_ext) br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpUltZero8 ; CHECK: mov [[RESULT:.*]],0x0 ; CHECK-NEXT: cmp [[RESULT]],0x0 ; OPTM1-LABEL: icmpUltZero8 ; OPTM1: mov [[RESULT:.*]],0x0 ; OPTM1-NEXT: cmp [[RESULT]],0x0 define internal void @icmpUgeZero8() { entry: %cmp = icmp uge i8 123, 0 br i1 %cmp, label %if.then, label %if.end if.then: ; preds = %entry %cmp_ext = zext i1 %cmp to i32 call void @use(i32 %cmp_ext) br label %if.end if.end: ; preds = %if.then, %if.end ret void } ; The following checks are not strictly necessary since one of the RUN ; lines actually runs the output through the assembler. ; CHECK-LABEL: icmpUgeZero8 ; CHECK: mov [[RESULT:.*]],0x1 ; CHECK-NEXT: cmp [[RESULT]],0x0 ; OPTM1-LABEL: icmpUgeZero8 ; OPTM1: mov [[RESULT:.*]],0x1 ; OPTM1-NEXT: cmp [[RESULT]],0x0 declare void @func() declare void @use(i32)