ARM: fix optimised division on WoA
authorSaleem Abdulrasool <compnerd@compnerd.org>
Fri, 25 Mar 2016 00:34:11 +0000 (00:34 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Fri, 25 Mar 2016 00:34:11 +0000 (00:34 +0000)
We did not have an explicit branch to the continuation BB.  When the check was
hoisted, this could permit control follow to fall through into the division
trap.  Add the explicit branch to the continuation basic block to ensure that
code execution is correct.

llvm-svn: 264370

llvm/lib/Target/ARM/ARMISelLowering.cpp
llvm/test/CodeGen/ARM/Windows/division.ll

index dc34d47..0d9b77a 100644 (file)
@@ -8064,6 +8064,7 @@ ARMTargetLowering::EmitLowered__dbzchk(MachineInstr *MI,
   BuildMI(*MBB, MI, DL, TII->get(ARM::tCBZ))
       .addReg(MI->getOperand(0).getReg())
       .addMBB(TrapBB);
+  AddDefaultPred(BuildMI(*MBB, MI, DL, TII->get(ARM::t2B)).addMBB(ContBB));
   MBB->addSuccessor(ContBB);
 
   MI->eraseFromParent();
index 098226e..a3d467f 100644 (file)
@@ -9,8 +9,9 @@ entry:
 
 ; CHECK-LABEL: sdiv32:
 ; CHECK: cbz r0
-; CHECK: bl __rt_sdiv
+; CHECK: b
 ; CHECK: udf.w #249
+; CHECK: bl __rt_sdiv
 
 define arm_aapcs_vfpcc i32 @udiv32(i32 %divisor, i32 %divident) {
 entry:
@@ -20,8 +21,9 @@ entry:
 
 ; CHECK-LABEL: udiv32:
 ; CHECK: cbz r0
-; CHECK: bl __rt_udiv
+; CHECK: b
 ; CHECK: udf.w #249
+; CHECK: bl __rt_udiv
 
 define arm_aapcs_vfpcc i64 @sdiv64(i64 %divisor, i64 %divident) {
 entry:
@@ -32,8 +34,9 @@ entry:
 ; CHECK-LABEL: sdiv64:
 ; CHECK: orr.w r12, r0, r1
 ; CHECK-NEXT: cbz r12
-; CHECK: bl __rt_sdiv64
+; CHECK: b
 ; CHECK: udf.w #249
+; CHECK: bl __rt_sdiv64
 
 define arm_aapcs_vfpcc i64 @udiv64(i64 %divisor, i64 %divident) {
 entry:
@@ -44,6 +47,32 @@ entry:
 ; CHECK-LABEL: udiv64:
 ; CHECK: orr.w r12, r0, r1
 ; CHECK-NEXT: cbz r12
+; CHECK: b
+; CHECK: udf.w #249
 ; CHECK: bl __rt_udiv64
+
+declare arm_aapcs_vfpcc i32 @g(...)
+
+define arm_aapcs_vfpcc i32 @f(i32 %b, i32 %d) #0 {
+entry:
+  %tobool = icmp eq i32 %b, 0
+  br i1 %tobool, label %return, label %if.then
+
+if.then:
+  %call = tail call arm_aapcs_vfpcc i32 bitcast (i32 (...)* @g to i32 ()*)()
+  %rem = urem i32 %call, %d
+  br label %return
+
+return:
+  %retval.0 = phi i32 [ %rem, %if.then ], [ 0, %entry ]
+  ret i32 %retval.0
+}
+
+; CHECK-LABEL: f:
+; CHECK: cbz r0,
+; CHECK: cbz r4,
+; CHECK: b
 ; CHECK: udf.w #249
 
+attributes #0 = { optsize }
+