@@ -536,31 +536,47 @@ struct FunCloner {
536
536
case LLVMAdd: {
537
537
LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
538
538
LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
539
+ LLVMBool NUW = LLVMGetNUW (Src);
540
+ LLVMBool NSW = LLVMGetNSW (Src);
539
541
Dst = LLVMBuildAdd (Builder, LHS, RHS, Name);
542
+ LLVMSetNUW (Dst, NUW);
543
+ LLVMSetNSW (Dst, NSW);
540
544
break ;
541
545
}
542
546
case LLVMSub: {
543
547
LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
544
548
LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
549
+ LLVMBool NUW = LLVMGetNUW (Src);
550
+ LLVMBool NSW = LLVMGetNSW (Src);
545
551
Dst = LLVMBuildSub (Builder, LHS, RHS, Name);
552
+ LLVMSetNUW (Dst, NUW);
553
+ LLVMSetNSW (Dst, NSW);
546
554
break ;
547
555
}
548
556
case LLVMMul: {
549
557
LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
550
558
LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
559
+ LLVMBool NUW = LLVMGetNUW (Src);
560
+ LLVMBool NSW = LLVMGetNSW (Src);
551
561
Dst = LLVMBuildMul (Builder, LHS, RHS, Name);
562
+ LLVMSetNUW (Dst, NUW);
563
+ LLVMSetNSW (Dst, NSW);
552
564
break ;
553
565
}
554
566
case LLVMUDiv: {
555
567
LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
556
568
LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
569
+ LLVMBool IsExact = LLVMGetExact (Src);
557
570
Dst = LLVMBuildUDiv (Builder, LHS, RHS, Name);
571
+ LLVMSetExact (Dst, IsExact);
558
572
break ;
559
573
}
560
574
case LLVMSDiv: {
561
575
LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
562
576
LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
577
+ LLVMBool IsExact = LLVMGetExact (Src);
563
578
Dst = LLVMBuildSDiv (Builder, LHS, RHS, Name);
579
+ LLVMSetExact (Dst, IsExact);
564
580
break ;
565
581
}
566
582
case LLVMURem: {
@@ -578,19 +594,27 @@ struct FunCloner {
578
594
case LLVMShl: {
579
595
LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
580
596
LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
597
+ LLVMBool NUW = LLVMGetNUW (Src);
598
+ LLVMBool NSW = LLVMGetNSW (Src);
581
599
Dst = LLVMBuildShl (Builder, LHS, RHS, Name);
600
+ LLVMSetNUW (Dst, NUW);
601
+ LLVMSetNSW (Dst, NSW);
582
602
break ;
583
603
}
584
604
case LLVMLShr: {
585
605
LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
586
606
LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
607
+ LLVMBool IsExact = LLVMGetExact (Src);
587
608
Dst = LLVMBuildLShr (Builder, LHS, RHS, Name);
609
+ LLVMSetExact (Dst, IsExact);
588
610
break ;
589
611
}
590
612
case LLVMAShr: {
591
613
LLVMValueRef LHS = CloneValue (LLVMGetOperand (Src, 0 ));
592
614
LLVMValueRef RHS = CloneValue (LLVMGetOperand (Src, 1 ));
615
+ LLVMBool IsExact = LLVMGetExact (Src);
593
616
Dst = LLVMBuildAShr (Builder, LHS, RHS, Name);
617
+ LLVMSetExact (Dst, IsExact);
594
618
break ;
595
619
}
596
620
case LLVMAnd: {
0 commit comments