This allows targets to make more decisions about reserved registers after isel. For example, now it should be certain there are calls or stack objects in the frame or not, which could have been introduced by legalization. Patch by Matthias Braun llvm-svn: 363757
186 lines
4.4 KiB
LLVM
186 lines
4.4 KiB
LLVM
; RUN: llc -mtriple thumbv7--windows-itanium -print-after=finalize-isel -verify-machineinstrs -o /dev/null %s 2>&1 | FileCheck %s -check-prefix CHECK-DIV
|
|
|
|
; int f(int n, int d) {
|
|
; if (n / d)
|
|
; return 1;
|
|
; return 0;
|
|
; }
|
|
|
|
define arm_aapcs_vfpcc i32 @f(i32 %n, i32 %d) {
|
|
entry:
|
|
%retval = alloca i32, align 4
|
|
%n.addr = alloca i32, align 4
|
|
%d.addr = alloca i32, align 4
|
|
store i32 %n, i32* %n.addr, align 4
|
|
store i32 %d, i32* %d.addr, align 4
|
|
%0 = load i32, i32* %n.addr, align 4
|
|
%1 = load i32, i32* %d.addr, align 4
|
|
%div = sdiv i32 %0, %1
|
|
%tobool = icmp ne i32 %div, 0
|
|
br i1 %tobool, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
store i32 1, i32* %retval, align 4
|
|
br label %return
|
|
|
|
if.end:
|
|
store i32 0, i32* %retval, align 4
|
|
br label %return
|
|
|
|
return:
|
|
%2 = load i32, i32* %retval, align 4
|
|
ret i32 %2
|
|
}
|
|
|
|
; CHECK-DIV-DAG: %bb.0
|
|
; CHECK-DIV-DAG: successors: %bb.1({{.*}}), %bb.2
|
|
; CHECK-DIV-DAG: %bb.1
|
|
; CHECK-DIV-DAG: successors: %bb.3
|
|
; CHECK-DIV-DAG: %bb.2
|
|
; CHECK-DIV-DAG: successors: %bb.3
|
|
; CHECK-DIV-DAG: %bb.3
|
|
|
|
; RUN: llc -mtriple thumbv7--windows-itanium -print-after=finalize-isel -verify-machineinstrs -o /dev/null %s 2>&1 | FileCheck %s -check-prefix CHECK-MOD
|
|
|
|
; int r;
|
|
; int g(int l, int m) {
|
|
; if (m <= 0)
|
|
; return 0;
|
|
; return (r = l % m);
|
|
; }
|
|
|
|
@r = common global i32 0, align 4
|
|
|
|
define arm_aapcs_vfpcc i32 @g(i32 %l, i32 %m) {
|
|
entry:
|
|
%cmp = icmp eq i32 %m, 0
|
|
br i1 %cmp, label %return, label %if.end
|
|
|
|
if.end:
|
|
%rem = urem i32 %l, %m
|
|
store i32 %rem, i32* @r, align 4
|
|
br label %return
|
|
|
|
return:
|
|
%retval.0 = phi i32 [ %rem, %if.end ], [ 0, %entry ]
|
|
ret i32 %retval.0
|
|
}
|
|
|
|
; CHECK-MOD-DAG: %bb.0
|
|
; CHECK-MOD-DAG: successors: %bb.2({{.*}}), %bb.1
|
|
; CHECK-MOD-DAG: %bb.1
|
|
; CHECK-MOD-DAG: successors: %bb.3
|
|
; CHECK-MOD-DAG: %bb.3
|
|
; CHECK-MOD-DAG: successors: %bb.2
|
|
; CHECK-MOD-DAG: %bb.2
|
|
|
|
; RUN: llc -mtriple thumbv7--windows-itanium -print-after=finalize-isel -verify-machineinstrs -filetype asm -o /dev/null %s 2>&1 | FileCheck %s -check-prefix CHECK-CFG
|
|
; RUN: llc -mtriple thumbv7--windows-itanium -verify-machineinstrs -filetype asm -o - %s | FileCheck %s -check-prefix CHECK-CFG-ASM
|
|
|
|
; unsigned c;
|
|
; extern unsigned long g(void);
|
|
; int f(unsigned u, signed char b) {
|
|
; if (b)
|
|
; c = g() % u;
|
|
; return c;
|
|
; }
|
|
|
|
@c = common global i32 0, align 4
|
|
|
|
declare arm_aapcs_vfpcc i32 @i()
|
|
|
|
define arm_aapcs_vfpcc i32 @h(i32 %u, i8 signext %b) #0 {
|
|
entry:
|
|
%tobool = icmp eq i8 %b, 0
|
|
br i1 %tobool, label %entry.if.end_crit_edge, label %if.then
|
|
|
|
entry.if.end_crit_edge:
|
|
%.pre = load i32, i32* @c, align 4
|
|
br label %if.end
|
|
|
|
if.then:
|
|
%call = tail call arm_aapcs_vfpcc i32 @i()
|
|
%rem = urem i32 %call, %u
|
|
store i32 %rem, i32* @c, align 4
|
|
br label %if.end
|
|
|
|
if.end:
|
|
%0 = phi i32 [ %.pre, %entry.if.end_crit_edge ], [ %rem, %if.then ]
|
|
ret i32 %0
|
|
}
|
|
|
|
attributes #0 = { optsize }
|
|
|
|
; CHECK-CFG-DAG: %bb.0
|
|
; CHECK-CFG-DAG: t2Bcc %bb.2
|
|
; CHECK-CFG-DAG: t2B %bb.1
|
|
|
|
; CHECK-CFG-DAG: %bb.1
|
|
; CHECK-CFG-DAG: t2B %bb.3
|
|
|
|
; CHECK-CFG-DAG: %bb.2
|
|
; CHECK-CFG-DAG: tCMPi8 %{{[0-9]}}{{[^,]*}}, 0
|
|
; CHECK-CFG-DAG: t2Bcc %bb.5
|
|
|
|
; CHECK-CFG-DAG: %bb.4
|
|
|
|
; CHECK-CFG-DAG: %bb.3
|
|
; CHECK-CFG-DAG: tBX_RET
|
|
|
|
; CHECK-CFG-DAG: %bb.5
|
|
; CHECK-CFG-DAG: t__brkdiv0
|
|
|
|
; CHECK-CFG-ASM-LABEL: h:
|
|
; CHECK-CFG-ASM: cbz r{{[0-9]}}, .LBB2_4
|
|
; CHECK-CFG-ASM: bl __rt_udiv
|
|
; CHECK-CFG-ASM-LABEL: .LBB2_4:
|
|
; CHECK-CFG-ASM: __brkdiv0
|
|
|
|
; RUN: llc -O1 -mtriple thumbv7--windows-itanium -verify-machineinstrs -filetype asm -o - %s | FileCheck %s -check-prefix CHECK-WIN__DBZCHK
|
|
|
|
; long k(void);
|
|
; int l(void);
|
|
; int j(int i) {
|
|
; if (l() == -1)
|
|
; return 0;
|
|
; return k() % i;
|
|
; }
|
|
|
|
declare arm_aapcs_vfpcc i32 @k()
|
|
declare arm_aapcs_vfpcc i32 @l()
|
|
|
|
define arm_aapcs_vfpcc i32 @j(i32 %i) {
|
|
entry:
|
|
%retval = alloca i32, align 4
|
|
%i.addr = alloca i32, align 4
|
|
store i32 %i, i32* %i.addr, align 4
|
|
%call = call arm_aapcs_vfpcc i32 @l()
|
|
%cmp = icmp eq i32 %call, -1
|
|
br i1 %cmp, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
store i32 0, i32* %retval, align 4
|
|
br label %return
|
|
|
|
if.end:
|
|
%call1 = call arm_aapcs_vfpcc i32 @k()
|
|
%0 = load i32, i32* %i.addr, align 4
|
|
%rem = srem i32 %call1, %0
|
|
store i32 %rem, i32* %retval, align 4
|
|
br label %return
|
|
|
|
return:
|
|
%1 = load i32, i32* %retval, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
; CHECK-WIN__DBZCHK-LABEL: j:
|
|
; CHECK-WIN__DBZCHK: cbz r{{[0-7]}}, .LBB
|
|
; CHECK-WIN__DBZCHK-NOT: cbz r8, .LBB
|
|
; CHECK-WIN__DBZCHK-NOT: cbz r9, .LBB
|
|
; CHECK-WIN__DBZCHK-NOT: cbz r10, .LBB
|
|
; CHECK-WIN__DBZCHK-NOT: cbz r11, .LBB
|
|
; CHECK-WIN__DBZCHK-NOT: cbz ip, .LBB
|
|
; CHECK-WIN__DBZCHK-NOT: cbz lr, .LBB
|
|
|