Index: include/llvm/Target/TargetLowering.h =================================================================== --- include/llvm/Target/TargetLowering.h +++ include/llvm/Target/TargetLowering.h @@ -592,7 +592,7 @@ /// Returns true if the operation can trap for the value type. /// /// VT must be a legal type. By default, we optimistically assume most - /// operations don't trap except for divide and remainder. + /// operations don't trap except for integer divide and remainder. virtual bool canOpTrap(unsigned Op, EVT VT) const; /// Similar to isShuffleMaskLegal. This is used by Targets can use this to Index: lib/CodeGen/TargetLoweringBase.cpp =================================================================== --- lib/CodeGen/TargetLoweringBase.cpp +++ lib/CodeGen/TargetLoweringBase.cpp @@ -955,15 +955,11 @@ return getScalarShiftAmountTy(DL, LHSTy); } -/// canOpTrap - Returns true if the operation can trap for the value type. -/// VT must be a legal type. bool TargetLoweringBase::canOpTrap(unsigned Op, EVT VT) const { assert(isTypeLegal(VT)); switch (Op) { default: return false; - case ISD::FDIV: - case ISD::FREM: case ISD::SDIV: case ISD::UDIV: case ISD::SREM: Index: test/CodeGen/X86/vec3.ll =================================================================== --- test/CodeGen/X86/vec3.ll +++ test/CodeGen/X86/vec3.ll @@ -19,16 +19,8 @@ define <3 x float> @fdiv(<3 x float> %v, float %d) { ; CHECK-LABEL: fdiv: ; CHECK: # BB#0: -; CHECK-NEXT: movaps %xmm1, %xmm2 -; CHECK-NEXT: movaps %xmm0, %xmm3 -; CHECK-NEXT: movaps %xmm1, %xmm4 -; CHECK-NEXT: divss %xmm0, %xmm1 -; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] -; CHECK-NEXT: divss %xmm0, %xmm2 -; CHECK-NEXT: movhlps {{.*#+}} xmm3 = xmm3[1,1] -; CHECK-NEXT: divss %xmm3, %xmm4 -; CHECK-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] -; CHECK-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] +; CHECK-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0,0,3] +; CHECK-NEXT: divps %xmm0, %xmm1 ; CHECK-NEXT: movaps %xmm1, %xmm0 ; CHECK-NEXT: retq ;