; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; REQUIRES: x86-registered-target, mips-registered-target ; RUN: opt -mtriple=x86_64 -passes=pre-isel-intrinsic-lowering -S < %s | FileCheck --check-prefix=X86 %s ; RUN: opt -mtriple=mips64 -passes=pre-isel-intrinsic-lowering -S < %s | FileCheck --check-prefix=MIPS %s define void @f1(i64 %a, i64 %b, i64 %c, i64 %d) { ; X86-LABEL: define void @f1( ; X86-SAME: i64 [[A:%.*]], i64 [[B:%.*]], i64 [[C:%.*]], i64 [[D:%.*]]) { ; X86-NEXT: [[CMP:%.*]] = icmp ult i64 [[A]], [[B]] ; X86-NEXT: call void @llvm.cond.loop(i1 [[CMP]]) ; X86-NEXT: br i1 false, label %[[TRAP:.*]], label %[[CONT1:.*]] ; X86: [[CONT1]]: ; X86-NEXT: [[CMP2:%.*]] = icmp ult i64 [[C]], [[D]] ; X86-NEXT: [[TMP1:%.*]] = xor i1 [[CMP2]], true ; X86-NEXT: call void @llvm.cond.loop(i1 [[TMP1]]) ; X86-NEXT: br i1 true, label %[[CONT2:.*]], label %[[TRAP]] ; X86: [[CONT2]]: ; X86-NEXT: ret void ; X86: [[TRAP]]: ; X86-NEXT: call void @llvm.cond.loop(i1 true) ; X86-NEXT: unreachable ; ; MIPS-LABEL: define void @f1( ; MIPS-SAME: i64 [[A:%.*]], i64 [[B:%.*]], i64 [[C:%.*]], i64 [[D:%.*]]) { ; MIPS-NEXT: [[CMP:%.*]] = icmp ult i64 [[A]], [[B]] ; MIPS-NEXT: br i1 [[CMP]], label %[[BB1:.*]], label %[[BB2:.*]] ; MIPS: [[BB1]]: ; MIPS-NEXT: br label %[[BB1]] ; MIPS: [[BB2]]: ; MIPS-NEXT: br i1 false, label %[[TRAP:.*]], label %[[CONT1:.*]] ; MIPS: [[CONT1]]: ; MIPS-NEXT: [[CMP2:%.*]] = icmp ult i64 [[C]], [[D]] ; MIPS-NEXT: [[TMP3:%.*]] = xor i1 [[CMP2]], true ; MIPS-NEXT: br i1 [[TMP3]], label %[[BB4:.*]], label %[[BB5:.*]] ; MIPS: [[BB4]]: ; MIPS-NEXT: br label %[[BB4]] ; MIPS: [[BB5]]: ; MIPS-NEXT: br i1 true, label %[[CONT2:.*]], label %[[TRAP]] ; MIPS: [[CONT2]]: ; MIPS-NEXT: ret void ; MIPS: [[TRAP]]: ; MIPS-NEXT: br i1 true, label %[[BB6:.*]], label %[[BB7:.*]] ; MIPS: [[BB6]]: ; MIPS-NEXT: br label %[[BB6]] ; MIPS: [[BB7]]: ; MIPS-NEXT: unreachable ; %cmp = icmp ult i64 %a, %b br i1 %cmp, label %trap, label %cont1 cont1: %cmp2 = icmp ult i64 %c, %d br i1 %cmp2, label %cont2, label %trap cont2: ret void trap: call void @llvm.looptrap() unreachable } define void @f2() { ; X86-LABEL: define void @f2() { ; X86-NEXT: call void @llvm.cond.loop(i1 true) ; X86-NEXT: ret void ; ; MIPS-LABEL: define void @f2() { ; MIPS-NEXT: br i1 true, label %[[BB1:.*]], label %[[BB2:.*]] ; MIPS: [[BB1]]: ; MIPS-NEXT: br label %[[BB1]] ; MIPS: [[BB2]]: ; MIPS-NEXT: ret void ; call void @llvm.looptrap() ret void } define void @f3() personality ptr @foo { ; X86-LABEL: define void @f3() personality ptr @foo { ; X86-NEXT: invoke void @foo() ; X86-NEXT: to label %[[CONT:.*]] unwind label %[[TRAP:.*]] ; X86: [[CONT]]: ; X86-NEXT: ret void ; X86: [[TRAP]]: ; X86-NEXT: [[PAD:%.*]] = landingpad { ptr, i32 } ; X86-NEXT: cleanup ; X86-NEXT: call void @llvm.cond.loop(i1 true) ; X86-NEXT: unreachable ; ; MIPS-LABEL: define void @f3() personality ptr @foo { ; MIPS-NEXT: invoke void @foo() ; MIPS-NEXT: to label %[[CONT:.*]] unwind label %[[TRAP:.*]] ; MIPS: [[CONT]]: ; MIPS-NEXT: ret void ; MIPS: [[TRAP]]: ; MIPS-NEXT: [[PAD:%.*]] = landingpad { ptr, i32 } ; MIPS-NEXT: cleanup ; MIPS-NEXT: br i1 true, label %[[BB1:.*]], label %[[BB2:.*]] ; MIPS: [[BB1]]: ; MIPS-NEXT: br label %[[BB1]] ; MIPS: [[BB2]]: ; MIPS-NEXT: unreachable ; invoke void @foo() to label %cont unwind label %trap cont: ret void trap: %pad = landingpad { ptr, i32 } cleanup call void @llvm.looptrap() unreachable } define void @f4(i64 %a, i64 %b, ptr %p) { ; X86-LABEL: define void @f4( ; X86-SAME: i64 [[A:%.*]], i64 [[B:%.*]], ptr [[P:%.*]]) { ; X86-NEXT: [[CMP:%.*]] = icmp ult i64 [[A]], [[B]] ; X86-NEXT: br i1 [[CMP]], label %[[TRAP:.*]], label %[[CONT:.*]] ; X86: [[CONT]]: ; X86-NEXT: ret void ; X86: [[TRAP]]: ; X86-NEXT: store volatile i32 1, ptr [[P]], align 4 ; X86-NEXT: call void @llvm.cond.loop(i1 true) ; X86-NEXT: unreachable ; ; MIPS-LABEL: define void @f4( ; MIPS-SAME: i64 [[A:%.*]], i64 [[B:%.*]], ptr [[P:%.*]]) { ; MIPS-NEXT: [[CMP:%.*]] = icmp ult i64 [[A]], [[B]] ; MIPS-NEXT: br i1 [[CMP]], label %[[TRAP:.*]], label %[[CONT:.*]] ; MIPS: [[CONT]]: ; MIPS-NEXT: ret void ; MIPS: [[TRAP]]: ; MIPS-NEXT: store volatile i32 1, ptr [[P]], align 4 ; MIPS-NEXT: br i1 true, label %[[BB1:.*]], label %[[BB2:.*]] ; MIPS: [[BB1]]: ; MIPS-NEXT: br label %[[BB1]] ; MIPS: [[BB2]]: ; MIPS-NEXT: unreachable ; %cmp = icmp ult i64 %a, %b br i1 %cmp, label %trap, label %cont cont: ret void trap: store volatile i32 1, ptr %p call void @llvm.looptrap() unreachable } declare void @foo()