@@ -536,31 +536,47 @@ struct FunCloner {
536536 case LLVMAdd: {
537537 LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
538538 LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
539+ LLVMBool NUW = LLVMGetNUW (Src);
540+ LLVMBool NSW = LLVMGetNSW (Src);
539541 Dst = LLVMBuildAdd (Builder, LHS, RHS, Name);
542+ LLVMSetNUW (Dst, NUW);
543+ LLVMSetNSW (Dst, NSW);
540544 break ;
541545 }
542546 case LLVMSub: {
543547 LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
544548 LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
549+ LLVMBool NUW = LLVMGetNUW (Src);
550+ LLVMBool NSW = LLVMGetNSW (Src);
545551 Dst = LLVMBuildSub (Builder, LHS, RHS, Name);
552+ LLVMSetNUW (Dst, NUW);
553+ LLVMSetNSW (Dst, NSW);
546554 break ;
547555 }
548556 case LLVMMul: {
549557 LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
550558 LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
559+ LLVMBool NUW = LLVMGetNUW (Src);
560+ LLVMBool NSW = LLVMGetNSW (Src);
551561 Dst = LLVMBuildMul (Builder, LHS, RHS, Name);
562+ LLVMSetNUW (Dst, NUW);
563+ LLVMSetNSW (Dst, NSW);
552564 break ;
553565 }
554566 case LLVMUDiv: {
555567 LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
556568 LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
569+ LLVMBool IsExact = LLVMGetExact (Src);
557570 Dst = LLVMBuildUDiv (Builder, LHS, RHS, Name);
571+ LLVMSetExact (Dst, IsExact);
558572 break ;
559573 }
560574 case LLVMSDiv: {
561575 LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
562576 LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
577+ LLVMBool IsExact = LLVMGetExact (Src);
563578 Dst = LLVMBuildSDiv (Builder, LHS, RHS, Name);
579+ LLVMSetExact (Dst, IsExact);
564580 break ;
565581 }
566582 case LLVMURem: {
@@ -578,19 +594,27 @@ struct FunCloner {
578594 case LLVMShl: {
579595 LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
580596 LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
597+ LLVMBool NUW = LLVMGetNUW (Src);
598+ LLVMBool NSW = LLVMGetNSW (Src);
581599 Dst = LLVMBuildShl (Builder, LHS, RHS, Name);
600+ LLVMSetNUW (Dst, NUW);
601+ LLVMSetNSW (Dst, NSW);
582602 break ;
583603 }
584604 case LLVMLShr: {
585605 LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
586606 LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
607+ LLVMBool IsExact = LLVMGetExact (Src);
587608 Dst = LLVMBuildLShr (Builder, LHS, RHS, Name);
609+ LLVMSetExact (Dst, IsExact);
588610 break ;
589611 }
590612 case LLVMAShr: {
591613 LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
592614 LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
615+ LLVMBool IsExact = LLVMGetExact (Src);
593616 Dst = LLVMBuildAShr (Builder, LHS, RHS, Name);
617+ LLVMSetExact (Dst, IsExact);
594618 break ;
595619 }
596620 case LLVMAnd: {
0 commit comments