@@ -728,6 +728,37 @@ exit:
728
728
ret void
729
729
}
730
730
731
+
732
+ define void @or_icmps_probably_not_harmful (i32 %x , i32 %y , i8* %p ) {
733
+ ; CHECK-LABEL: @or_icmps_probably_not_harmful(
734
+ ; CHECK-NEXT: entry:
735
+ ; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
736
+ ; CHECK-NEXT: br i1 [[EXPECTED_TRUE]], label [[EXIT:%.*]], label [[RARE:%.*]], !prof [[PROF19]], !unpredictable !21
737
+ ; CHECK: rare:
738
+ ; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
739
+ ; CHECK-NEXT: br i1 [[EXPENSIVE]], label [[EXIT]], label [[FALSE:%.*]]
740
+ ; CHECK: false:
741
+ ; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
742
+ ; CHECK-NEXT: br label [[EXIT]]
743
+ ; CHECK: exit:
744
+ ; CHECK-NEXT: ret void
745
+ ;
746
+ entry:
747
+ %expected_true = icmp sgt i32 %x , -1
748
+ br i1 %expected_true , label %exit , label %rare , !prof !15 , !unpredictable !20
749
+
750
+ rare:
751
+ %expensive = icmp eq i32 %y , 0
752
+ br i1 %expensive , label %exit , label %false
753
+
754
+ false:
755
+ store i8 42 , i8* %p , align 1
756
+ br label %exit
757
+
758
+ exit:
759
+ ret void
760
+ }
761
+
731
762
; The probability threshold is determined by a TTI setting.
732
763
; In this example, we are just short of strongly expected, so speculate.
733
764
@@ -737,7 +768,7 @@ define void @or_icmps_not_that_harmful(i32 %x, i32 %y, i8* %p) {
737
768
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
738
769
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
739
770
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
740
- ; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF21 :![0-9]+]]
771
+ ; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF22 :![0-9]+]]
741
772
; CHECK: false:
742
773
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
743
774
; CHECK-NEXT: br label [[EXIT]]
@@ -769,7 +800,7 @@ define void @or_icmps_not_that_harmful_inverted(i32 %x, i32 %y, i8* %p) {
769
800
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
770
801
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
771
802
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
772
- ; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF22 :![0-9]+]]
803
+ ; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF23 :![0-9]+]]
773
804
; CHECK: false:
774
805
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
775
806
; CHECK-NEXT: br label [[EXIT]]
@@ -800,7 +831,7 @@ define void @or_icmps_useful(i32 %x, i32 %y, i8* %p) {
800
831
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
801
832
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
802
833
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 true, i1 [[EXPENSIVE]]
803
- ; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF23 :![0-9]+]]
834
+ ; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF24 :![0-9]+]]
804
835
; CHECK: false:
805
836
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
806
837
; CHECK-NEXT: br label [[EXIT]]
@@ -831,7 +862,7 @@ define void @or_icmps_useful_inverted(i32 %x, i32 %y, i8* %p) {
831
862
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
832
863
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
833
864
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 true, i1 [[EXPENSIVE]]
834
- ; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF23 ]]
865
+ ; CHECK-NEXT: br i1 [[OR_COND]], label [[EXIT:%.*]], label [[FALSE:%.*]], !prof [[PROF24 ]]
835
866
; CHECK: false:
836
867
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
837
868
; CHECK-NEXT: br label [[EXIT]]
@@ -960,7 +991,7 @@ define void @and_icmps_not_that_harmful(i32 %x, i32 %y, i8* %p) {
960
991
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sgt i32 [[X:%.*]], -1
961
992
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
962
993
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
963
- ; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF24 :![0-9]+]]
994
+ ; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF25 :![0-9]+]]
964
995
; CHECK: false:
965
996
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
966
997
; CHECK-NEXT: br label [[EXIT]]
@@ -992,7 +1023,7 @@ define void @and_icmps_not_that_harmful_inverted(i32 %x, i32 %y, i8* %p) {
992
1023
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sle i32 [[X:%.*]], -1
993
1024
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
994
1025
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
995
- ; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF24 ]]
1026
+ ; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF25 ]]
996
1027
; CHECK: false:
997
1028
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
998
1029
; CHECK-NEXT: br label [[EXIT]]
@@ -1023,7 +1054,7 @@ define void @and_icmps_useful(i32 %x, i32 %y, i8* %p) {
1023
1054
; CHECK-NEXT: [[EXPECTED_TRUE:%.*]] = icmp sgt i32 [[X:%.*]], -1
1024
1055
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
1025
1056
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_TRUE]], i1 [[EXPENSIVE]], i1 false
1026
- ; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF25 :![0-9]+]]
1057
+ ; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26 :![0-9]+]]
1027
1058
; CHECK: false:
1028
1059
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
1029
1060
; CHECK-NEXT: br label [[EXIT]]
@@ -1054,7 +1085,7 @@ define void @and_icmps_useful_inverted(i32 %x, i32 %y, i8* %p) {
1054
1085
; CHECK-NEXT: [[EXPECTED_FALSE:%.*]] = icmp sle i32 [[X:%.*]], -1
1055
1086
; CHECK-NEXT: [[EXPENSIVE:%.*]] = icmp eq i32 [[Y:%.*]], 0
1056
1087
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[EXPECTED_FALSE]], i1 [[EXPENSIVE]], i1 false
1057
- ; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF25 ]]
1088
+ ; CHECK-NEXT: br i1 [[OR_COND]], label [[FALSE:%.*]], label [[EXIT:%.*]], !prof [[PROF26 ]]
1058
1089
; CHECK: false:
1059
1090
; CHECK-NEXT: store i8 42, i8* [[P:%.*]], align 1
1060
1091
; CHECK-NEXT: br label [[EXIT]]
@@ -1098,6 +1129,7 @@ exit:
1098
1129
!17 = !{!"branch_weights" , i32 98 , i32 1 }
1099
1130
!18 = !{!"branch_weights" , i32 1 , i32 98 }
1100
1131
!19 = !{!"branch_weights" , i32 0 , i32 0 }
1132
+ !20 = !{}
1101
1133
1102
1134
;.
1103
1135
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nounwind uwtable }
@@ -1125,9 +1157,10 @@ exit:
1125
1157
; CHECK: [[PROF18]] = !{!"branch_weights", i32 8, i32 2}
1126
1158
; CHECK: [[PROF19]] = !{!"branch_weights", i32 99, i32 1}
1127
1159
; CHECK: [[PROF20]] = !{!"branch_weights", i32 1, i32 99}
1128
- ; CHECK: [[PROF21]] = !{!"branch_weights", i32 197, i32 1}
1129
- ; CHECK: [[PROF22]] = !{!"branch_weights", i32 100, i32 98}
1130
- ; CHECK: [[PROF23]] = !{!"branch_weights", i32 101, i32 99}
1131
- ; CHECK: [[PROF24]] = !{!"branch_weights", i32 1, i32 197}
1132
- ; CHECK: [[PROF25]] = !{!"branch_weights", i32 99, i32 101}
1160
+ ; CHECK: [[META21:![0-9]+]] = !{}
1161
+ ; CHECK: [[PROF22]] = !{!"branch_weights", i32 197, i32 1}
1162
+ ; CHECK: [[PROF23]] = !{!"branch_weights", i32 100, i32 98}
1163
+ ; CHECK: [[PROF24]] = !{!"branch_weights", i32 101, i32 99}
1164
+ ; CHECK: [[PROF25]] = !{!"branch_weights", i32 1, i32 197}
1165
+ ; CHECK: [[PROF26]] = !{!"branch_weights", i32 99, i32 101}
1133
1166
;.
0 commit comments