@@ -30,9 +30,10 @@ define i64 @mul_select(i64 %a, i64 %b) {
3030; (select (icmp x, 0, eq), 0, (shl x, y)) -> (shl x, y)
3131define i64 @shl_select (i64 %a , i64 %b ) {
3232; CHECK-LABEL: @shl_select(
33- ; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
34- ; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A:%.*]], [[B_FR]]
35- ; CHECK-NEXT: ret i64 [[SHL]]
33+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
34+ ; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A]], [[B_FR:%.*]]
35+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[SHL]]
36+ ; CHECK-NEXT: ret i64 [[SELECT]]
3637;
3738 %cond = icmp eq i64 %a , 0
3839 %shl = shl i64 %a , %b
@@ -56,9 +57,10 @@ define i64 @and_select(i64 %a, i64 %b) {
5657; (select (icmp x, 0, ne), (ashr x, y), 0) -> (ashr x, y)
5758define i64 @ashr_select (i64 %a , i64 %b ) {
5859; CHECK-LABEL: @ashr_select(
59- ; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
60- ; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[A:%.*]], [[B_FR]]
61- ; CHECK-NEXT: ret i64 [[ASHR]]
60+ ; CHECK-NEXT: [[COND_NOT:%.*]] = icmp eq i64 [[A:%.*]], 0
61+ ; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[A]], [[B_FR:%.*]]
62+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND_NOT]], i64 0, i64 [[ASHR]]
63+ ; CHECK-NEXT: ret i64 [[SELECT]]
6264;
6365 %cond = icmp ne i64 0 , %a
6466 %ashr = ashr i64 %a , %b
@@ -69,9 +71,10 @@ define i64 @ashr_select(i64 %a, i64 %b) {
6971; (select (icmp x, 0, ne), (lshr x, y), 0) -> (lshr x, y)
7072define i64 @lshr_select (i64 %a , i64 %b ) {
7173; CHECK-LABEL: @lshr_select(
72- ; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
73- ; CHECK-NEXT: [[LSHR:%.*]] = lshr i64 [[A:%.*]], [[B_FR]]
74- ; CHECK-NEXT: ret i64 [[LSHR]]
74+ ; CHECK-NEXT: [[COND_NOT:%.*]] = icmp eq i64 [[A:%.*]], 0
75+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i64 [[A]], [[B_FR:%.*]]
76+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND_NOT]], i64 0, i64 [[LSHR]]
77+ ; CHECK-NEXT: ret i64 [[SELECT]]
7578;
7679 %cond = icmp ne i64 0 , %a
7780 %lshr = lshr i64 %a , %b
0 commit comments