@@ -27,6 +27,19 @@ define i64 @mul_select(i64 %a, i64 %b) {
27
27
ret i64 %select
28
28
}
29
29
30
+ ; (select (icmp x, 0, eq), 0, (mul x, y)) -> (mul x, y)
31
+ define i64 @mul_select_comm (i64 %a , i64 %b ) {
32
+ ; CHECK-LABEL: @mul_select_comm(
33
+ ; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
34
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[B_FR]], [[A:%.*]]
35
+ ; CHECK-NEXT: ret i64 [[MUL]]
36
+ ;
37
+ %cond = icmp eq i64 %a , 0
38
+ %mul = mul i64 %b , %a
39
+ %select = select i1 %cond , i64 0 , i64 %mul
40
+ ret i64 %select
41
+ }
42
+
30
43
; (select (icmp x, 0, eq), 0, (shl x, y)) -> (shl x, y)
31
44
define i64 @shl_select (i64 %a , i64 %b ) {
32
45
; CHECK-LABEL: @shl_select(
@@ -54,6 +67,19 @@ define i64 @and_select(i64 %a, i64 %b) {
54
67
ret i64 %select
55
68
}
56
69
70
+ ; (select (icmp x, 0, eq), 0, (and x, y)) -> (and x, y)
71
+ define i64 @and_select_comm (i64 %a , i64 %b ) {
72
+ ; CHECK-LABEL: @and_select_comm(
73
+ ; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
74
+ ; CHECK-NEXT: [[AND:%.*]] = and i64 [[B_FR]], [[A:%.*]]
75
+ ; CHECK-NEXT: ret i64 [[AND]]
76
+ ;
77
+ %cond = icmp eq i64 %a , 0
78
+ %and = and i64 %b , %a
79
+ %select = select i1 %cond , i64 0 , i64 %and
80
+ ret i64 %select
81
+ }
82
+
57
83
; (select (icmp x, 0, ne), (ashr x, y), 0) -> (ashr x, y)
58
84
define i64 @ashr_select (i64 %a , i64 %b ) {
59
85
; CHECK-LABEL: @ashr_select(
0 commit comments