Index: include/llvm-c/Core.h =================================================================== --- include/llvm-c/Core.h +++ include/llvm-c/Core.h @@ -3286,6 +3286,8 @@ LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name); LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name); +LLVMBool LLVMIsExact(LLVMValueRef V); + /* Memory */ LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name); LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty, Index: lib/IR/Core.cpp =================================================================== --- lib/IR/Core.cpp +++ lib/IR/Core.cpp @@ -2997,6 +2997,10 @@ return wrap(unwrap(B)->CreateNot(unwrap(V), Name)); } +LLVMBool LLVMIsExact(LLVMValueRef V) { + return cast(unwrap(V))->isExact(); +} + /*--.. Memory ..............................................................--*/ LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty, Index: test/Bindings/llvm-c/echo.ll =================================================================== --- test/Bindings/llvm-c/echo.ll +++ test/Bindings/llvm-c/echo.ll @@ -61,6 +61,8 @@ %3 = sub i32 %2, %1 %4 = udiv i32 %3, %b %5 = sdiv i32 %2, %4 + %e4 = udiv exact i32 %3, %b + %e5 = sdiv exact i32 %2, %4 %6 = urem i32 %3, %5 %7 = srem i32 %2, %6 %8 = shl i32 %1, %b Index: tools/llvm-c-test/echo.cpp =================================================================== --- tools/llvm-c-test/echo.cpp +++ tools/llvm-c-test/echo.cpp @@ -500,13 +500,19 @@ case LLVMUDiv: { LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildUDiv(Builder, LHS, RHS, Name); + if (LLVMIsExact(Src)) + Dst = LLVMBuildExactUDiv(Builder, LHS, RHS, Name); + else + Dst = LLVMBuildUDiv(Builder, LHS, RHS, Name); break; } case LLVMSDiv: { LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0)); LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1)); - Dst = LLVMBuildSDiv(Builder, LHS, RHS, Name); + if (LLVMIsExact(Src)) + Dst = LLVMBuildExactSDiv(Builder, LHS, RHS, Name); + else + Dst = LLVMBuildSDiv(Builder, LHS, RHS, Name); break; } case LLVMURem: {