| ; 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() |