1742c15adSNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2742c15adSNoah Goldstein; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3742c15adSNoah Goldstein 4742c15adSNoah Goldsteindeclare i8 @llvm.smin.i8(i8, i8) 5742c15adSNoah Goldsteindeclare i8 @llvm.umin.i8(i8, i8) 6742c15adSNoah Goldsteindeclare i8 @llvm.smax.i8(i8, i8) 7742c15adSNoah Goldsteindeclare i8 @llvm.umax.i8(i8, i8) 8742c15adSNoah Goldstein 9dd5c5349SNikita Popovdeclare void @llvm.assume(i1) 10dd5c5349SNikita Popov 11742c15adSNoah Goldsteindeclare void @use.i8(i8) 127ab0a871SYingwei Zhengdeclare void @use.i1(i1) 13742c15adSNoah Goldstein 14742c15adSNoah Goldsteindefine i8 @xor_1(i8 %a, i1 %c, i8 %x, i8 %y) { 15742c15adSNoah Goldstein; CHECK-LABEL: @xor_1( 163039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 17b7c0f799SNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 18b7c0f799SNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = xor i8 [[TMP2]], [[A:%.*]] 19742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 20742c15adSNoah Goldstein; 21742c15adSNoah Goldstein %nx = xor i8 %x, -1 22742c15adSNoah Goldstein %yy = xor i8 %y, 123 23742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 24742c15adSNoah Goldstein %ba = xor i8 %b, %a 25742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 26742c15adSNoah Goldstein ret i8 %not_ba 27742c15adSNoah Goldstein} 28742c15adSNoah Goldstein 29742c15adSNoah Goldsteindefine i8 @xor_2(i8 %a, i1 %c, i8 %x, i8 %y) { 30742c15adSNoah Goldstein; CHECK-LABEL: @xor_2( 313039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 32b7c0f799SNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 33*a1058776SNikita Popov; CHECK-NEXT: [[NOT_AB:%.*]] = xor i8 [[A:%.*]], [[TMP2]] 34742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 35742c15adSNoah Goldstein; 36742c15adSNoah Goldstein %nx = xor i8 %x, -1 37742c15adSNoah Goldstein %yy = xor i8 %y, 123 38742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 39742c15adSNoah Goldstein %ab = xor i8 %a, %b 40742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 41742c15adSNoah Goldstein ret i8 %not_ab 42742c15adSNoah Goldstein} 43742c15adSNoah Goldstein 44742c15adSNoah Goldsteindefine i8 @xor_fail(i8 %a, i1 %c, i8 %x, i8 %y) { 45742c15adSNoah Goldstein; CHECK-LABEL: @xor_fail( 46742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1 47742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[Y:%.*]] 48*a1058776SNikita Popov; CHECK-NEXT: [[AB:%.*]] = xor i8 [[A:%.*]], [[B]] 49742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = xor i8 [[AB]], -1 50742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 51742c15adSNoah Goldstein; 52742c15adSNoah Goldstein %nx = xor i8 %x, -1 53742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %y 54742c15adSNoah Goldstein %ab = xor i8 %a, %b 55742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 56742c15adSNoah Goldstein ret i8 %not_ab 57742c15adSNoah Goldstein} 58742c15adSNoah Goldstein 59742c15adSNoah Goldsteindefine i8 @add_1(i8 %a, i1 %c, i8 %x, i8 %y) { 60742c15adSNoah Goldstein; CHECK-LABEL: @add_1( 613039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 623039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 633039691fSNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = sub i8 [[TMP2]], [[A:%.*]] 64742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 65742c15adSNoah Goldstein; 66742c15adSNoah Goldstein %nx = xor i8 %x, -1 67742c15adSNoah Goldstein %yy = xor i8 %y, 123 68742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 69742c15adSNoah Goldstein %ba = add i8 %b, %a 70742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 71742c15adSNoah Goldstein ret i8 %not_ba 72742c15adSNoah Goldstein} 73742c15adSNoah Goldstein 74742c15adSNoah Goldsteindefine i8 @add_2(i8 %a, i1 %c, i8 %x, i8 %y) { 75742c15adSNoah Goldstein; CHECK-LABEL: @add_2( 763039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 773039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 783039691fSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = sub i8 [[TMP2]], [[A:%.*]] 79742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 80742c15adSNoah Goldstein; 81742c15adSNoah Goldstein %nx = xor i8 %x, -1 82742c15adSNoah Goldstein %yy = xor i8 %y, 123 83742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 84742c15adSNoah Goldstein %ab = add i8 %a, %b 85742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 86742c15adSNoah Goldstein ret i8 %not_ab 87742c15adSNoah Goldstein} 88742c15adSNoah Goldstein 89742c15adSNoah Goldsteindefine i8 @add_fail(i8 %a, i1 %c, i8 %x, i8 %y) { 90742c15adSNoah Goldstein; CHECK-LABEL: @add_fail( 91742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], [[A:%.*]] 92742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 123 93742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]] 94*a1058776SNikita Popov; CHECK-NEXT: [[AB:%.*]] = add i8 [[A]], [[B]] 95742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = xor i8 [[AB]], -1 96742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 97742c15adSNoah Goldstein; 98742c15adSNoah Goldstein %nx = xor i8 %x, %a 99742c15adSNoah Goldstein %yy = xor i8 %y, 123 100742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 101742c15adSNoah Goldstein %ab = add i8 %a, %b 102742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 103742c15adSNoah Goldstein ret i8 %not_ab 104742c15adSNoah Goldstein} 105742c15adSNoah Goldstein 106742c15adSNoah Goldsteindefine i8 @sub_1(i8 %a, i1 %c, i8 %x, i8 %y) { 107742c15adSNoah Goldstein; CHECK-LABEL: @sub_1( 1083039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 1093039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 1103039691fSNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = add i8 [[TMP2]], [[A:%.*]] 111742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 112742c15adSNoah Goldstein; 113742c15adSNoah Goldstein %nx = xor i8 %x, -1 114742c15adSNoah Goldstein %yy = xor i8 %y, 123 115742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 116742c15adSNoah Goldstein %ba = sub i8 %b, %a 117742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 118742c15adSNoah Goldstein ret i8 %not_ba 119742c15adSNoah Goldstein} 120742c15adSNoah Goldstein 121742c15adSNoah Goldsteindefine i8 @sub_2(i8 %a, i1 %c, i8 %x, i8 %y) { 122742c15adSNoah Goldstein; CHECK-LABEL: @sub_2( 1235271d330SNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 1245271d330SNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 1255271d330SNoah Goldstein; CHECK-NEXT: [[TMP3:%.*]] = add i8 [[TMP2]], [[A:%.*]] 1265271d330SNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = sub i8 -2, [[TMP3]] 127742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 128742c15adSNoah Goldstein; 129742c15adSNoah Goldstein %nx = xor i8 %x, -1 130742c15adSNoah Goldstein %yy = xor i8 %y, 123 131742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 132742c15adSNoah Goldstein %ab = sub i8 %a, %b 133742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 134742c15adSNoah Goldstein ret i8 %not_ab 135742c15adSNoah Goldstein} 136742c15adSNoah Goldstein 1377f1c8fc2SCraig Topper; Same as above but with a type larger than i64 to make sure we create -2 1387f1c8fc2SCraig Topper; correctly. 1397f1c8fc2SCraig Topperdefine i128 @sub_3(i128 %a, i1 %c, i128 %x, i128 %y) { 1407f1c8fc2SCraig Topper; CHECK-LABEL: @sub_3( 1417f1c8fc2SCraig Topper; CHECK-NEXT: [[TMP1:%.*]] = xor i128 [[Y:%.*]], -124 1427f1c8fc2SCraig Topper; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i128 [[X:%.*]], i128 [[TMP1]] 1437f1c8fc2SCraig Topper; CHECK-NEXT: [[TMP3:%.*]] = add i128 [[TMP2]], [[A:%.*]] 1447f1c8fc2SCraig Topper; CHECK-NEXT: [[NOT_AB:%.*]] = sub i128 -2, [[TMP3]] 1457f1c8fc2SCraig Topper; CHECK-NEXT: ret i128 [[NOT_AB]] 1467f1c8fc2SCraig Topper; 1477f1c8fc2SCraig Topper %nx = xor i128 %x, -1 1487f1c8fc2SCraig Topper %yy = xor i128 %y, 123 1497f1c8fc2SCraig Topper %b = select i1 %c, i128 %nx, i128 %yy 1507f1c8fc2SCraig Topper %ab = sub i128 %a, %b 1517f1c8fc2SCraig Topper %not_ab = xor i128 %ab, -1 1527f1c8fc2SCraig Topper ret i128 %not_ab 1537f1c8fc2SCraig Topper} 1547f1c8fc2SCraig Topper 155742c15adSNoah Goldsteindefine i8 @sub_fail(i8 %a, i1 %c, i8 %x, i8 %y) { 156742c15adSNoah Goldstein; CHECK-LABEL: @sub_fail( 157742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1 158742c15adSNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[NX]]) 1593039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 1603039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X]], i8 [[TMP1]] 1613039691fSNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = add i8 [[TMP2]], [[A:%.*]] 162742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 163742c15adSNoah Goldstein; 164742c15adSNoah Goldstein %nx = xor i8 %x, -1 165742c15adSNoah Goldstein %yy = xor i8 %y, 123 166742c15adSNoah Goldstein call void @use.i8(i8 %nx) 167742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 168742c15adSNoah Goldstein %ba = sub i8 %b, %a 169742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 170742c15adSNoah Goldstein ret i8 %not_ba 171742c15adSNoah Goldstein} 172742c15adSNoah Goldstein 173742c15adSNoah Goldsteindefine i8 @ashr_1(i8 %a, i1 %c, i8 %x, i8 %y) { 174742c15adSNoah Goldstein; CHECK-LABEL: @ashr_1( 1753039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 1763039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 1773039691fSNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = ashr i8 [[TMP2]], [[A:%.*]] 178742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 179742c15adSNoah Goldstein; 180742c15adSNoah Goldstein %nx = xor i8 %x, -1 181742c15adSNoah Goldstein %yy = xor i8 %y, 123 182742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 183742c15adSNoah Goldstein %ba = ashr i8 %b, %a 184742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 185742c15adSNoah Goldstein ret i8 %not_ba 186742c15adSNoah Goldstein} 187742c15adSNoah Goldstein 188742c15adSNoah Goldsteindefine i8 @ashr_2_fail(i8 %a, i1 %c, i8 %x, i8 %y) { 189742c15adSNoah Goldstein; CHECK-LABEL: @ashr_2_fail( 190742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1 191742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 123 192742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]] 193742c15adSNoah Goldstein; CHECK-NEXT: [[AB:%.*]] = ashr i8 [[A:%.*]], [[B]] 194742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = xor i8 [[AB]], -1 195742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 196742c15adSNoah Goldstein; 197742c15adSNoah Goldstein %nx = xor i8 %x, -1 198742c15adSNoah Goldstein %yy = xor i8 %y, 123 199742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 200742c15adSNoah Goldstein %ab = ashr i8 %a, %b 201742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 202742c15adSNoah Goldstein ret i8 %not_ab 203742c15adSNoah Goldstein} 204742c15adSNoah Goldstein 205742c15adSNoah Goldsteindefine i8 @select_1(i1 %cc, i8 %na, i8 %aa, i1 %c, i8 %x, i8 %y) { 206742c15adSNoah Goldstein; CHECK-LABEL: @select_1( 207742c15adSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[NA:%.*]], [[AA:%.*]] 2083039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = xor i8 [[TMP1]], -46 2093039691fSNoah Goldstein; CHECK-NEXT: [[TMP3:%.*]] = xor i8 [[Y:%.*]], -124 2103039691fSNoah Goldstein; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP3]] 2113039691fSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = select i1 [[CC:%.*]], i8 [[TMP2]], i8 [[TMP4]] 212742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 213742c15adSNoah Goldstein; 214742c15adSNoah Goldstein %nx = xor i8 %x, -1 215742c15adSNoah Goldstein %yy = xor i8 %y, 123 216742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 217742c15adSNoah Goldstein %nna = xor i8 %na, 45 218742c15adSNoah Goldstein %a = xor i8 %aa, %nna 219742c15adSNoah Goldstein %ab = select i1 %cc, i8 %a, i8 %b 220742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 221742c15adSNoah Goldstein ret i8 %not_ab 222742c15adSNoah Goldstein} 223742c15adSNoah Goldstein 224742c15adSNoah Goldsteindefine i8 @select_2(i1 %cc, i8 %na, i1 %c, i8 %x, i8 %y) { 225742c15adSNoah Goldstein; CHECK-LABEL: @select_2( 2263039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 2273039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 2283039691fSNoah Goldstein; CHECK-NEXT: [[TMP3:%.*]] = xor i8 [[NA:%.*]], -46 2293039691fSNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = select i1 [[CC:%.*]], i8 [[TMP2]], i8 [[TMP3]] 230742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 231742c15adSNoah Goldstein; 232742c15adSNoah Goldstein %nx = xor i8 %x, -1 233742c15adSNoah Goldstein %yy = xor i8 %y, 123 234742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 235742c15adSNoah Goldstein %a = xor i8 %na, 45 236742c15adSNoah Goldstein %ba = select i1 %cc, i8 %b, i8 %a 237742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 238742c15adSNoah Goldstein ret i8 %not_ba 239742c15adSNoah Goldstein} 240742c15adSNoah Goldstein 241742c15adSNoah Goldsteindefine i1 @select_logic_or_fail(i1 %cc, i1 %c, i1 %x, i8 %y) { 242742c15adSNoah Goldstein; CHECK-LABEL: @select_logic_or_fail( 243742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i1 [[X:%.*]], true 244742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = icmp eq i8 [[Y:%.*]], 123 245742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i1 [[NX]], i1 [[YY]] 246742c15adSNoah Goldstein; CHECK-NEXT: [[AB:%.*]] = select i1 [[CC:%.*]], i1 [[B]], i1 false 247742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = xor i1 [[AB]], true 248742c15adSNoah Goldstein; CHECK-NEXT: ret i1 [[NOT_AB]] 249742c15adSNoah Goldstein; 250742c15adSNoah Goldstein %nx = xor i1 %x, -1 251742c15adSNoah Goldstein %yy = icmp eq i8 %y, 123 252742c15adSNoah Goldstein %b = select i1 %c, i1 %nx, i1 %yy 253742c15adSNoah Goldstein %ab = select i1 %cc, i1 %b, i1 false 254742c15adSNoah Goldstein %not_ab = xor i1 %ab, -1 255742c15adSNoah Goldstein ret i1 %not_ab 256742c15adSNoah Goldstein} 257742c15adSNoah Goldstein 258742c15adSNoah Goldsteindefine i1 @select_logic_and_fail(i1 %cc, i1 %c, i1 %x, i8 %y) { 259742c15adSNoah Goldstein; CHECK-LABEL: @select_logic_and_fail( 260742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i1 [[X:%.*]], true 261742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = icmp eq i8 [[Y:%.*]], 123 262742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i1 [[NX]], i1 [[YY]] 263742c15adSNoah Goldstein; CHECK-NEXT: [[AB:%.*]] = select i1 [[CC:%.*]], i1 true, i1 [[B]] 264742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = xor i1 [[AB]], true 265742c15adSNoah Goldstein; CHECK-NEXT: ret i1 [[NOT_AB]] 266742c15adSNoah Goldstein; 267742c15adSNoah Goldstein %nx = xor i1 %x, -1 268742c15adSNoah Goldstein %yy = icmp eq i8 %y, 123 269742c15adSNoah Goldstein %b = select i1 %c, i1 %nx, i1 %yy 270742c15adSNoah Goldstein %ab = select i1 %cc, i1 true, i1 %b 271742c15adSNoah Goldstein %not_ab = xor i1 %ab, -1 272742c15adSNoah Goldstein ret i1 %not_ab 273742c15adSNoah Goldstein} 274742c15adSNoah Goldstein 275742c15adSNoah Goldsteindefine i8 @smin_1(i8 %aa, i8 %na, i1 %c, i8 %x, i8 %y) { 276742c15adSNoah Goldstein; CHECK-LABEL: @smin_1( 2773039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = sub i8 [[NA:%.*]], [[AA:%.*]] 2783039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = xor i8 [[Y:%.*]], -124 2793039691fSNoah Goldstein; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP2]] 2803039691fSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = call i8 @llvm.smax.i8(i8 [[TMP1]], i8 [[TMP3]]) 281742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 282742c15adSNoah Goldstein; 283742c15adSNoah Goldstein %nx = xor i8 %x, -1 284742c15adSNoah Goldstein %yy = xor i8 %y, 123 285742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 286742c15adSNoah Goldstein %nna = xor i8 %na, -1 287742c15adSNoah Goldstein %a = add i8 %aa, %nna 288742c15adSNoah Goldstein %ab = call i8 @llvm.smin.i8(i8 %a, i8 %b) 289742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 290742c15adSNoah Goldstein ret i8 %not_ab 291742c15adSNoah Goldstein} 292742c15adSNoah Goldstein 293742c15adSNoah Goldsteindefine i8 @smin_1_fail(i8 %a, i1 %c, i8 %x, i8 %y) { 294742c15adSNoah Goldstein; CHECK-LABEL: @smin_1_fail( 295742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1 296742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 123 297742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]] 298742c15adSNoah Goldstein; CHECK-NEXT: [[AB:%.*]] = call i8 @llvm.smin.i8(i8 [[A:%.*]], i8 [[B]]) 299742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = xor i8 [[AB]], -1 300742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 301742c15adSNoah Goldstein; 302742c15adSNoah Goldstein %nx = xor i8 %x, -1 303742c15adSNoah Goldstein %yy = xor i8 %y, 123 304742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 305742c15adSNoah Goldstein %ab = call i8 @llvm.smin.i8(i8 %a, i8 %b) 306742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 307742c15adSNoah Goldstein ret i8 %not_ab 308742c15adSNoah Goldstein} 309742c15adSNoah Goldstein 310742c15adSNoah Goldsteindefine i8 @umin_1_fail(i1 %c, i8 %x, i8 %y) { 311742c15adSNoah Goldstein; CHECK-LABEL: @umin_1_fail( 312742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1 313742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[Y:%.*]] 314742c15adSNoah Goldstein; CHECK-NEXT: [[BA:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 85) 315742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = xor i8 [[BA]], -1 316742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 317742c15adSNoah Goldstein; 318742c15adSNoah Goldstein %nx = xor i8 %x, -1 319742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %y 320742c15adSNoah Goldstein %ba = call i8 @llvm.umin.i8(i8 %b, i8 85) 321742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 322742c15adSNoah Goldstein ret i8 %not_ba 323742c15adSNoah Goldstein} 324742c15adSNoah Goldstein 325742c15adSNoah Goldsteindefine i8 @smax_1(i8 %aa, i8 %na, i1 %c, i8 %x, i8 %y) { 326742c15adSNoah Goldstein; CHECK-LABEL: @smax_1( 3273039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[NA:%.*]], [[AA:%.*]] 3283039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = xor i8 [[Y:%.*]], -124 3293039691fSNoah Goldstein; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP2]] 3303039691fSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = call i8 @llvm.smin.i8(i8 [[TMP1]], i8 [[TMP3]]) 331742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 332742c15adSNoah Goldstein; 333742c15adSNoah Goldstein %nx = xor i8 %x, -1 334742c15adSNoah Goldstein %yy = xor i8 %y, 123 335742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 336742c15adSNoah Goldstein %nna = xor i8 %na, -1 337742c15adSNoah Goldstein %a = sub i8 %nna, %aa 338742c15adSNoah Goldstein %ab = call i8 @llvm.smax.i8(i8 %a, i8 %b) 339742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 340742c15adSNoah Goldstein ret i8 %not_ab 341742c15adSNoah Goldstein} 342742c15adSNoah Goldstein 343742c15adSNoah Goldsteindefine i8 @smax_1_fail(i8 %aa, i8 %na, i1 %c, i8 %x, i8 %y) { 344742c15adSNoah Goldstein; CHECK-LABEL: @smax_1_fail( 345742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1 346742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 123 347742c15adSNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[YY]]) 348742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]] 349742c15adSNoah Goldstein; CHECK-NEXT: [[NNA:%.*]] = xor i8 [[NA:%.*]], -1 350742c15adSNoah Goldstein; CHECK-NEXT: [[A:%.*]] = sub i8 [[NNA]], [[AA:%.*]] 351742c15adSNoah Goldstein; CHECK-NEXT: [[AB:%.*]] = call i8 @llvm.smax.i8(i8 [[A]], i8 [[B]]) 352742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_AB:%.*]] = xor i8 [[AB]], -1 353742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_AB]] 354742c15adSNoah Goldstein; 355742c15adSNoah Goldstein %nx = xor i8 %x, -1 356742c15adSNoah Goldstein %yy = xor i8 %y, 123 357742c15adSNoah Goldstein call void @use.i8(i8 %yy) 358742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 359742c15adSNoah Goldstein %nna = xor i8 %na, -1 360742c15adSNoah Goldstein %a = sub i8 %nna, %aa 361742c15adSNoah Goldstein %ab = call i8 @llvm.smax.i8(i8 %a, i8 %b) 362742c15adSNoah Goldstein %not_ab = xor i8 %ab, -1 363742c15adSNoah Goldstein ret i8 %not_ab 364742c15adSNoah Goldstein} 365742c15adSNoah Goldstein 366742c15adSNoah Goldsteindefine i8 @umax_1(i8 %na, i1 %c, i8 %x, i8 %y) { 367742c15adSNoah Goldstein; CHECK-LABEL: @umax_1( 3683039691fSNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124 3693039691fSNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]] 3703039691fSNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = call i8 @llvm.umin.i8(i8 [[TMP2]], i8 -86) 371742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 372742c15adSNoah Goldstein; 373742c15adSNoah Goldstein %nx = xor i8 %x, -1 374742c15adSNoah Goldstein %yy = xor i8 %y, 123 375742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 376742c15adSNoah Goldstein %ba = call i8 @llvm.umax.i8(i8 %b, i8 85) 377742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 378742c15adSNoah Goldstein ret i8 %not_ba 379742c15adSNoah Goldstein} 380742c15adSNoah Goldstein 381742c15adSNoah Goldsteindefine i8 @umax_1_fail(i8 %na, i1 %c, i8 %x, i8 %y) { 382742c15adSNoah Goldstein; CHECK-LABEL: @umax_1_fail( 383742c15adSNoah Goldstein; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1 384742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 123 385742c15adSNoah Goldstein; CHECK-NEXT: [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]] 386742c15adSNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[B]]) 387742c15adSNoah Goldstein; CHECK-NEXT: [[BA:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 85) 388742c15adSNoah Goldstein; CHECK-NEXT: [[NOT_BA:%.*]] = xor i8 [[BA]], -1 389742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[NOT_BA]] 390742c15adSNoah Goldstein; 391742c15adSNoah Goldstein %nx = xor i8 %x, -1 392742c15adSNoah Goldstein %yy = xor i8 %y, 123 393742c15adSNoah Goldstein %b = select i1 %c, i8 %nx, i8 %yy 394742c15adSNoah Goldstein call void @use.i8(i8 %b) 395742c15adSNoah Goldstein %ba = call i8 @llvm.umax.i8(i8 %b, i8 85) 396742c15adSNoah Goldstein %not_ba = xor i8 %ba, -1 397742c15adSNoah Goldstein ret i8 %not_ba 398742c15adSNoah Goldstein} 399742c15adSNoah Goldstein 400742c15adSNoah Goldsteindefine i8 @sub_both_freely_invertable_always(i8 %x, i8 %y) { 401742c15adSNoah Goldstein; CHECK-LABEL: @sub_both_freely_invertable_always( 402742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 123 403742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 45 404742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub i8 [[XX]], [[YY]] 405742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 406742c15adSNoah Goldstein; 407742c15adSNoah Goldstein %xx = xor i8 %x, 123 408742c15adSNoah Goldstein %yy = xor i8 %y, 45 409742c15adSNoah Goldstein %r = sub i8 %xx, %yy 410742c15adSNoah Goldstein ret i8 %r 411742c15adSNoah Goldstein} 412742c15adSNoah Goldstein 413742c15adSNoah Goldsteindefine i8 @add_both_freely_invertable_always(i8 %x, i8 %y) { 414742c15adSNoah Goldstein; CHECK-LABEL: @add_both_freely_invertable_always( 415742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 123 416742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 45 417742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = add i8 [[XX]], [[YY]] 418742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 419742c15adSNoah Goldstein; 420742c15adSNoah Goldstein %xx = xor i8 %x, 123 421742c15adSNoah Goldstein %yy = xor i8 %y, 45 422742c15adSNoah Goldstein %r = add i8 %xx, %yy 423742c15adSNoah Goldstein ret i8 %r 424742c15adSNoah Goldstein} 425742c15adSNoah Goldstein 426742c15adSNoah Goldsteindefine i8 @xor_both_freely_invertable_always(i8 %x, i8 %y) { 427742c15adSNoah Goldstein; CHECK-LABEL: @xor_both_freely_invertable_always( 428742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = add i8 [[X:%.*]], 123 429742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = add i8 [[Y:%.*]], 45 430742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = xor i8 [[XX]], [[YY]] 431742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 432742c15adSNoah Goldstein; 433742c15adSNoah Goldstein %xx = add i8 %x, 123 434742c15adSNoah Goldstein %yy = add i8 %y, 45 435742c15adSNoah Goldstein %r = xor i8 %xx, %yy 436742c15adSNoah Goldstein ret i8 %r 437742c15adSNoah Goldstein} 438742c15adSNoah Goldstein 439742c15adSNoah Goldsteindefine i8 @ashr_both_freely_invertable_always(i8 %x, i8 %y) { 440742c15adSNoah Goldstein; CHECK-LABEL: @ashr_both_freely_invertable_always( 441742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 123 442742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 45 443742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = ashr i8 [[XX]], [[YY]] 444742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 445742c15adSNoah Goldstein; 446742c15adSNoah Goldstein %xx = xor i8 %x, 123 447742c15adSNoah Goldstein %yy = xor i8 %y, 45 448742c15adSNoah Goldstein %r = ashr i8 %xx, %yy 449742c15adSNoah Goldstein ret i8 %r 450742c15adSNoah Goldstein} 451742c15adSNoah Goldstein 452742c15adSNoah Goldsteindefine i8 @select_both_freely_invertable_always(i1 %cc, i8 %x, i8 %y) { 453742c15adSNoah Goldstein; CHECK-LABEL: @select_both_freely_invertable_always( 454742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 123 455742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 45 456742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], i8 [[XX]], i8 [[YY]] 457742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 458742c15adSNoah Goldstein; 459742c15adSNoah Goldstein %xx = xor i8 %x, 123 460742c15adSNoah Goldstein %yy = xor i8 %y, 45 461742c15adSNoah Goldstein %r = select i1 %cc, i8 %xx, i8 %yy 462742c15adSNoah Goldstein ret i8 %r 463742c15adSNoah Goldstein} 464742c15adSNoah Goldstein 465742c15adSNoah Goldsteindefine i8 @umin_both_freely_invertable_always(i8 %x, i8 %y) { 466742c15adSNoah Goldstein; CHECK-LABEL: @umin_both_freely_invertable_always( 467742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 123 468742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 45 469742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.umin.i8(i8 [[XX]], i8 [[YY]]) 470742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 471742c15adSNoah Goldstein; 472742c15adSNoah Goldstein %xx = xor i8 %x, 123 473742c15adSNoah Goldstein %yy = xor i8 %y, 45 474742c15adSNoah Goldstein %r = call i8 @llvm.umin.i8(i8 %xx, i8 %yy) 475742c15adSNoah Goldstein ret i8 %r 476742c15adSNoah Goldstein} 477742c15adSNoah Goldstein 478742c15adSNoah Goldsteindefine i8 @umax_both_freely_invertable_always(i8 %x, i8 %y) { 479742c15adSNoah Goldstein; CHECK-LABEL: @umax_both_freely_invertable_always( 480742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 123 481742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 45 482742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.umax.i8(i8 [[XX]], i8 [[YY]]) 483742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 484742c15adSNoah Goldstein; 485742c15adSNoah Goldstein %xx = xor i8 %x, 123 486742c15adSNoah Goldstein %yy = xor i8 %y, 45 487742c15adSNoah Goldstein %r = call i8 @llvm.umax.i8(i8 %xx, i8 %yy) 488742c15adSNoah Goldstein ret i8 %r 489742c15adSNoah Goldstein} 490742c15adSNoah Goldstein 491742c15adSNoah Goldsteindefine i8 @smin_both_freely_invertable_always(i8 %x, i8 %y) { 492742c15adSNoah Goldstein; CHECK-LABEL: @smin_both_freely_invertable_always( 493742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 123 494742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 45 495742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.smin.i8(i8 [[XX]], i8 [[YY]]) 496742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 497742c15adSNoah Goldstein; 498742c15adSNoah Goldstein %xx = xor i8 %x, 123 499742c15adSNoah Goldstein %yy = xor i8 %y, 45 500742c15adSNoah Goldstein %r = call i8 @llvm.smin.i8(i8 %xx, i8 %yy) 501742c15adSNoah Goldstein ret i8 %r 502742c15adSNoah Goldstein} 503742c15adSNoah Goldstein 504742c15adSNoah Goldsteindefine i8 @smax_both_freely_invertable_always(i8 %x, i8 %y) { 505742c15adSNoah Goldstein; CHECK-LABEL: @smax_both_freely_invertable_always( 506742c15adSNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 123 507742c15adSNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = xor i8 [[Y:%.*]], 45 508742c15adSNoah Goldstein; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.smax.i8(i8 [[XX]], i8 [[YY]]) 509742c15adSNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 510742c15adSNoah Goldstein; 511742c15adSNoah Goldstein %xx = xor i8 %x, 123 512742c15adSNoah Goldstein %yy = xor i8 %y, 45 513742c15adSNoah Goldstein %r = call i8 @llvm.smax.i8(i8 %xx, i8 %yy) 514742c15adSNoah Goldstein ret i8 %r 515742c15adSNoah Goldstein} 516dd5c5349SNikita Popov 517dd5c5349SNikita Popovdefine i8 @lshr_nneg(i8 %x, i8 %y) { 518dd5c5349SNikita Popov; CHECK-LABEL: @lshr_nneg( 519dd5c5349SNikita Popov; CHECK-NEXT: [[NEG:%.*]] = icmp slt i8 [[X:%.*]], 0 520dd5c5349SNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[NEG]]) 521faebb1b2SNikita Popov; CHECK-NEXT: [[SHR_NOT:%.*]] = ashr i8 [[X]], [[Y:%.*]] 522dd5c5349SNikita Popov; CHECK-NEXT: ret i8 [[SHR_NOT]] 523dd5c5349SNikita Popov; 524dd5c5349SNikita Popov %neg = icmp slt i8 %x, 0 525dd5c5349SNikita Popov call void @llvm.assume(i1 %neg) 526dd5c5349SNikita Popov %x.not = xor i8 %x, -1 527dd5c5349SNikita Popov %shr = lshr i8 %x.not, %y 528dd5c5349SNikita Popov %shr.not = xor i8 %shr, -1 529dd5c5349SNikita Popov ret i8 %shr.not 530dd5c5349SNikita Popov} 531dd5c5349SNikita Popov 532dd5c5349SNikita Popovdefine i8 @lshr_not_nneg(i8 %x, i8 %y) { 533dd5c5349SNikita Popov; CHECK-LABEL: @lshr_not_nneg( 534dd5c5349SNikita Popov; CHECK-NEXT: [[X_NOT:%.*]] = xor i8 [[X:%.*]], -1 535dd5c5349SNikita Popov; CHECK-NEXT: [[SHR:%.*]] = lshr i8 [[X_NOT]], [[Y:%.*]] 536dd5c5349SNikita Popov; CHECK-NEXT: [[SHR_NOT:%.*]] = xor i8 [[SHR]], -1 537dd5c5349SNikita Popov; CHECK-NEXT: ret i8 [[SHR_NOT]] 538dd5c5349SNikita Popov; 539dd5c5349SNikita Popov %x.not = xor i8 %x, -1 540dd5c5349SNikita Popov %shr = lshr i8 %x.not, %y 541dd5c5349SNikita Popov %shr.not = xor i8 %shr, -1 542dd5c5349SNikita Popov ret i8 %shr.not 543dd5c5349SNikita Popov} 5447007919cSNikita Popov 5457007919cSNikita Popovdefine i8 @lshr_not_nneg2(i8 %x) { 5467007919cSNikita Popov; CHECK-LABEL: @lshr_not_nneg2( 5477007919cSNikita Popov; CHECK-NEXT: [[SHR:%.*]] = lshr i8 [[X:%.*]], 1 5487ab0a871SYingwei Zheng; CHECK-NEXT: [[SHR_NOT:%.*]] = or disjoint i8 [[SHR]], -128 5497ab0a871SYingwei Zheng; CHECK-NEXT: ret i8 [[SHR_NOT]] 5507007919cSNikita Popov; 5517007919cSNikita Popov %x.not = xor i8 %x, -1 5527007919cSNikita Popov %shr = lshr i8 %x.not, 1 5537007919cSNikita Popov %shr.not = xor i8 %shr, -1 5547007919cSNikita Popov ret i8 %shr.not 5557007919cSNikita Popov} 5567ab0a871SYingwei Zheng 5577ab0a871SYingwei Zhengdefine i1 @test_inv_free(i1 %c1, i1 %c2, i1 %c3, i1 %c4) { 5587ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free( 5597ab0a871SYingwei Zheng; CHECK-NEXT: entry: 5607ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]] 5617ab0a871SYingwei Zheng; CHECK: b1: 5627ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]] 5637ab0a871SYingwei Zheng; CHECK: b2: 5647ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 5657ab0a871SYingwei Zheng; CHECK: b3: 5667ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 5677ab0a871SYingwei Zheng; CHECK: exit: 5687ab0a871SYingwei Zheng; CHECK-NEXT: [[VAL_NOT:%.*]] = phi i1 [ false, [[B1]] ], [ true, [[B2]] ], [ [[C3:%.*]], [[B3]] ] 5697ab0a871SYingwei Zheng; CHECK-NEXT: [[COND_NOT:%.*]] = and i1 [[VAL_NOT]], [[C4:%.*]] 5707ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[COND_NOT]], label [[B5:%.*]], label [[B4:%.*]] 5717ab0a871SYingwei Zheng; CHECK: b4: 5727ab0a871SYingwei Zheng; CHECK-NEXT: ret i1 true 5737ab0a871SYingwei Zheng; CHECK: b5: 5747ab0a871SYingwei Zheng; CHECK-NEXT: ret i1 false 5757ab0a871SYingwei Zheng; 5767ab0a871SYingwei Zhengentry: 5777ab0a871SYingwei Zheng br i1 %c1, label %b1, label %b2 5787ab0a871SYingwei Zhengb1: 5797ab0a871SYingwei Zheng br i1 %c2, label %exit, label %b3 5807ab0a871SYingwei Zhengb2: 5817ab0a871SYingwei Zheng br label %exit 5827ab0a871SYingwei Zhengb3: 5837ab0a871SYingwei Zheng %invc3 = xor i1 %c3, true 5847ab0a871SYingwei Zheng br label %exit 5857ab0a871SYingwei Zhengexit: 5867ab0a871SYingwei Zheng %val = phi i1 [ true, %b1 ], [ false, %b2 ], [ %invc3, %b3 ] 5877ab0a871SYingwei Zheng %inv = xor i1 %c4, true 5887ab0a871SYingwei Zheng %cond = or i1 %val, %inv 5897ab0a871SYingwei Zheng br i1 %cond, label %b4, label %b5 5907ab0a871SYingwei Zhengb4: 5917ab0a871SYingwei Zheng ret i1 true 5927ab0a871SYingwei Zhengb5: 5937ab0a871SYingwei Zheng ret i1 false 5947ab0a871SYingwei Zheng} 5957ab0a871SYingwei Zheng 5967ab0a871SYingwei Zhengdefine i32 @test_inv_free_i32(i1 %c1, i1 %c2, i32 %c3, i32 %c4) { 5977ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free_i32( 5987ab0a871SYingwei Zheng; CHECK-NEXT: entry: 5997ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]] 6007ab0a871SYingwei Zheng; CHECK: b1: 6017ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]] 6027ab0a871SYingwei Zheng; CHECK: b2: 6037ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 6047ab0a871SYingwei Zheng; CHECK: b3: 6057ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 6067ab0a871SYingwei Zheng; CHECK: exit: 6077ab0a871SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 0, [[B1]] ], [ -1, [[B2]] ], [ [[C3:%.*]], [[B3]] ] 608*a1058776SNikita Popov; CHECK-NEXT: [[COND:%.*]] = xor i32 [[C4:%.*]], [[TMP0]] 6097ab0a871SYingwei Zheng; CHECK-NEXT: ret i32 [[COND]] 6107ab0a871SYingwei Zheng; 6117ab0a871SYingwei Zhengentry: 6127ab0a871SYingwei Zheng br i1 %c1, label %b1, label %b2 6137ab0a871SYingwei Zhengb1: 6147ab0a871SYingwei Zheng br i1 %c2, label %exit, label %b3 6157ab0a871SYingwei Zhengb2: 6167ab0a871SYingwei Zheng br label %exit 6177ab0a871SYingwei Zhengb3: 6187ab0a871SYingwei Zheng %invc3 = xor i32 %c3, -1 6197ab0a871SYingwei Zheng br label %exit 6207ab0a871SYingwei Zhengexit: 6217ab0a871SYingwei Zheng %val = phi i32 [ -1, %b1 ], [ 0, %b2 ], [ %invc3, %b3 ] 6227ab0a871SYingwei Zheng %inv = xor i32 %c4, -1 6237ab0a871SYingwei Zheng %cond = xor i32 %val, %inv 6247ab0a871SYingwei Zheng ret i32 %cond 6257ab0a871SYingwei Zheng} 6267ab0a871SYingwei Zheng 6277ab0a871SYingwei Zheng; Negative tests 6287ab0a871SYingwei Zheng 6297ab0a871SYingwei Zhengdefine i1 @test_inv_free_multiuse(i1 %c1, i1 %c2, i1 %c3, i1 %c4) { 6307ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free_multiuse( 6317ab0a871SYingwei Zheng; CHECK-NEXT: entry: 6327ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]] 6337ab0a871SYingwei Zheng; CHECK: b1: 6347ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]] 6357ab0a871SYingwei Zheng; CHECK: b2: 6367ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 6377ab0a871SYingwei Zheng; CHECK: b3: 6387ab0a871SYingwei Zheng; CHECK-NEXT: [[INVC3:%.*]] = xor i1 [[C3:%.*]], true 6397ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 6407ab0a871SYingwei Zheng; CHECK: exit: 6417ab0a871SYingwei Zheng; CHECK-NEXT: [[VAL:%.*]] = phi i1 [ true, [[B1]] ], [ false, [[B2]] ], [ [[INVC3]], [[B3]] ] 6427ab0a871SYingwei Zheng; CHECK-NEXT: call void @use.i1(i1 [[VAL]]) 6437ab0a871SYingwei Zheng; CHECK-NEXT: [[INV:%.*]] = xor i1 [[C4:%.*]], true 6447ab0a871SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = or i1 [[VAL]], [[INV]] 6457ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[B4:%.*]], label [[B5:%.*]] 6467ab0a871SYingwei Zheng; CHECK: b4: 6477ab0a871SYingwei Zheng; CHECK-NEXT: ret i1 true 6487ab0a871SYingwei Zheng; CHECK: b5: 6497ab0a871SYingwei Zheng; CHECK-NEXT: ret i1 false 6507ab0a871SYingwei Zheng; 6517ab0a871SYingwei Zhengentry: 6527ab0a871SYingwei Zheng br i1 %c1, label %b1, label %b2 6537ab0a871SYingwei Zhengb1: 6547ab0a871SYingwei Zheng br i1 %c2, label %exit, label %b3 6557ab0a871SYingwei Zhengb2: 6567ab0a871SYingwei Zheng br label %exit 6577ab0a871SYingwei Zhengb3: 6587ab0a871SYingwei Zheng %invc3 = xor i1 %c3, true 6597ab0a871SYingwei Zheng br label %exit 6607ab0a871SYingwei Zhengexit: 6617ab0a871SYingwei Zheng %val = phi i1 [ true, %b1 ], [ false, %b2 ], [ %invc3, %b3 ] 6627ab0a871SYingwei Zheng call void @use.i1(i1 %val) 6637ab0a871SYingwei Zheng %inv = xor i1 %c4, true 6647ab0a871SYingwei Zheng %cond = or i1 %val, %inv 6657ab0a871SYingwei Zheng br i1 %cond, label %b4, label %b5 6667ab0a871SYingwei Zhengb4: 6677ab0a871SYingwei Zheng ret i1 true 6687ab0a871SYingwei Zhengb5: 6697ab0a871SYingwei Zheng ret i1 false 6707ab0a871SYingwei Zheng} 6717ab0a871SYingwei Zheng 6727ab0a871SYingwei Zhengdefine i32 @test_inv_free_i32_newinst(i1 %c1, i1 %c2, i32 %c3, i32 %c4) { 6737ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free_i32_newinst( 6747ab0a871SYingwei Zheng; CHECK-NEXT: entry: 6757ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]] 6767ab0a871SYingwei Zheng; CHECK: b1: 6777ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]] 6787ab0a871SYingwei Zheng; CHECK: b2: 6797ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 6807ab0a871SYingwei Zheng; CHECK: b3: 6817ab0a871SYingwei Zheng; CHECK-NEXT: [[ASHR:%.*]] = ashr i32 -8, [[C3:%.*]] 6827ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 6837ab0a871SYingwei Zheng; CHECK: exit: 6847ab0a871SYingwei Zheng; CHECK-NEXT: [[VAL:%.*]] = phi i32 [ -1, [[B1]] ], [ 0, [[B2]] ], [ [[ASHR]], [[B3]] ] 685*a1058776SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = xor i32 [[C4:%.*]], [[VAL]] 6867ab0a871SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = xor i32 [[TMP0]], -1 6877ab0a871SYingwei Zheng; CHECK-NEXT: ret i32 [[COND]] 6887ab0a871SYingwei Zheng; 6897ab0a871SYingwei Zhengentry: 6907ab0a871SYingwei Zheng br i1 %c1, label %b1, label %b2 6917ab0a871SYingwei Zhengb1: 6927ab0a871SYingwei Zheng br i1 %c2, label %exit, label %b3 6937ab0a871SYingwei Zhengb2: 6947ab0a871SYingwei Zheng br label %exit 6957ab0a871SYingwei Zhengb3: 6967ab0a871SYingwei Zheng %ashr = ashr i32 -8, %c3 6977ab0a871SYingwei Zheng br label %exit 6987ab0a871SYingwei Zhengexit: 6997ab0a871SYingwei Zheng %val = phi i32 [ -1, %b1 ], [ 0, %b2 ], [ %ashr, %b3 ] 7007ab0a871SYingwei Zheng %inv = xor i32 %c4, -1 7017ab0a871SYingwei Zheng %cond = xor i32 %val, %inv 7027ab0a871SYingwei Zheng ret i32 %cond 7037ab0a871SYingwei Zheng} 7047ab0a871SYingwei Zheng 7057ab0a871SYingwei Zhengdefine i1 @test_inv_free_loop(i1 %c1, i1 %c2, i1 %c3, i1 %c4) { 7067ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free_loop( 7077ab0a871SYingwei Zheng; CHECK-NEXT: entry: 7087ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]] 7097ab0a871SYingwei Zheng; CHECK: b1: 7107ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]] 7117ab0a871SYingwei Zheng; CHECK: b2: 7127ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 7137ab0a871SYingwei Zheng; CHECK: b3: 7147ab0a871SYingwei Zheng; CHECK-NEXT: [[INVC3:%.*]] = xor i1 [[C3:%.*]], true 7157ab0a871SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 7167ab0a871SYingwei Zheng; CHECK: exit: 7177ab0a871SYingwei Zheng; CHECK-NEXT: [[VAL:%.*]] = phi i1 [ true, [[B1]] ], [ false, [[B2]] ], [ [[INVC3]], [[B3]] ], [ [[NOT:%.*]], [[EXIT]] ] 7187ab0a871SYingwei Zheng; CHECK-NEXT: [[INV:%.*]] = xor i1 [[C4:%.*]], true 7197ab0a871SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = or i1 [[VAL]], [[INV]] 7207ab0a871SYingwei Zheng; CHECK-NEXT: [[NOT]] = xor i1 [[VAL]], true 7217ab0a871SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[EXIT]], label [[B4:%.*]] 7227ab0a871SYingwei Zheng; CHECK: b4: 7237ab0a871SYingwei Zheng; CHECK-NEXT: ret i1 true 7247ab0a871SYingwei Zheng; 7257ab0a871SYingwei Zhengentry: 7267ab0a871SYingwei Zheng br i1 %c1, label %b1, label %b2 7277ab0a871SYingwei Zhengb1: 7287ab0a871SYingwei Zheng br i1 %c2, label %exit, label %b3 7297ab0a871SYingwei Zhengb2: 7307ab0a871SYingwei Zheng br label %exit 7317ab0a871SYingwei Zhengb3: 7327ab0a871SYingwei Zheng %invc3 = xor i1 %c3, true 7337ab0a871SYingwei Zheng br label %exit 7347ab0a871SYingwei Zhengexit: 7357ab0a871SYingwei Zheng %val = phi i1 [ true, %b1 ], [ false, %b2 ], [ %invc3, %b3 ], [ %not, %exit ] 7367ab0a871SYingwei Zheng %inv = xor i1 %c4, true 7377ab0a871SYingwei Zheng %cond = or i1 %val, %inv 7387ab0a871SYingwei Zheng %not = xor i1 %val, true 7397ab0a871SYingwei Zheng br i1 %cond, label %exit, label %b4 7407ab0a871SYingwei Zhengb4: 7417ab0a871SYingwei Zheng ret i1 true 7427ab0a871SYingwei Zheng} 743