@@ -723,6 +723,69 @@ loop:
723
723
br label %loop
724
724
}
725
725
726
+ ; Trivially hoist or disjoint.
727
+ define void @or_all_disjoint (i64 %c1 , i64 %c2 ) {
728
+ ; CHECK-LABEL: @or_all_disjoint(
729
+ ; CHECK-NEXT: entry:
730
+ ; CHECK-NEXT: [[INVARIANT_OP:%.*]] = or disjoint i64 [[C1:%.*]], [[C2:%.*]]
731
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
732
+ ; CHECK: loop:
733
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT_REASS:%.*]], [[LOOP]] ]
734
+ ; CHECK-NEXT: [[INDEX_NEXT_REASS]] = or disjoint i64 [[INDEX]], [[INVARIANT_OP]]
735
+ ; CHECK-NEXT: br label [[LOOP]]
736
+ ;
737
+ entry:
738
+ br label %loop
739
+
740
+ loop:
741
+ %index = phi i64 [ 0 , %entry ], [ %index.next , %loop ]
742
+ %step.add = or disjoint i64 %index , %c1
743
+ %index.next = or disjoint i64 %c2 , %step.add
744
+ br label %loop
745
+ }
746
+
747
+ ; Trivially hoist or, disjoint on first or only .
748
+ define void @or_disjoint_on_first_or_only (i64 %c1 , i64 %c2 ) {
749
+ ; CHECK-LABEL: @or_disjoint_on_first_or_only(
750
+ ; CHECK-NEXT: entry:
751
+ ; CHECK-NEXT: [[INVARIANT_OP:%.*]] = or i64 [[C1:%.*]], [[C2:%.*]]
752
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
753
+ ; CHECK: loop:
754
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT_REASS:%.*]], [[LOOP]] ]
755
+ ; CHECK-NEXT: [[INDEX_NEXT_REASS]] = or i64 [[INDEX]], [[INVARIANT_OP]]
756
+ ; CHECK-NEXT: br label [[LOOP]]
757
+ ;
758
+ entry:
759
+ br label %loop
760
+
761
+ loop:
762
+ %index = phi i64 [ 0 , %entry ], [ %index.next , %loop ]
763
+ %step.add = or i64 %index , %c1
764
+ %index.next = or disjoint i64 %c2 , %step.add
765
+ br label %loop
766
+ }
767
+
768
+ ; Trivially hoist or, disjoint on second or only .
769
+ define void @or_disjoint_on_second_or_only (i64 %c1 , i64 %c2 ) {
770
+ ; CHECK-LABEL: @or_disjoint_on_second_or_only(
771
+ ; CHECK-NEXT: entry:
772
+ ; CHECK-NEXT: [[INVARIANT_OP:%.*]] = or i64 [[C1:%.*]], [[C2:%.*]]
773
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
774
+ ; CHECK: loop:
775
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT_REASS:%.*]], [[LOOP]] ]
776
+ ; CHECK-NEXT: [[INDEX_NEXT_REASS]] = or i64 [[INDEX]], [[INVARIANT_OP]]
777
+ ; CHECK-NEXT: br label [[LOOP]]
778
+ ;
779
+ entry:
780
+ br label %loop
781
+
782
+ loop:
783
+ %index = phi i64 [ 0 , %entry ], [ %index.next , %loop ]
784
+ %step.add = or disjoint i64 %index , %c1
785
+ %index.next = or i64 %c2 , %step.add
786
+ br label %loop
787
+ }
788
+
726
789
; Trivially hoist xor.
727
790
define void @xor (i64 %c1 , i64 %c2 ) {
728
791
; CHECK-LABEL: @xor(
0 commit comments