11ce02652SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 21ce02652SNoah Goldstein; RUN: opt < %s -passes=instcombine -S | FileCheck %s 31ce02652SNoah Goldstein 41ce02652SNoah Goldsteindeclare i8 @llvm.fshl.i8(i8, i8, i8) 51ce02652SNoah Goldsteindeclare i8 @llvm.fshr.i8(i8, i8, i8) 61ce02652SNoah Goldsteindeclare void @use.i8(i8) 71ce02652SNoah Goldsteindefine i1 @cmpeq_rorr_to_rorl(i8 %x, i8 %C) { 81ce02652SNoah Goldstein; CHECK-LABEL: @cmpeq_rorr_to_rorl( 95189eff3SNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 [[C:%.*]]) 10*a1058776SNikita Popov; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X]], [[TMP1]] 111ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 121ce02652SNoah Goldstein; 131ce02652SNoah Goldstein %x_rorr = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C) 141ce02652SNoah Goldstein %r = icmp eq i8 %x_rorr, %x 151ce02652SNoah Goldstein ret i1 %r 161ce02652SNoah Goldstein} 171ce02652SNoah Goldstein 181ce02652SNoah Goldsteindefine i1 @cmpeq_rorr_to_rorl_non_equality_fail(i8 %x, i8 %C) { 191ce02652SNoah Goldstein; CHECK-LABEL: @cmpeq_rorr_to_rorl_non_equality_fail( 201ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORR:%.*]] = call i8 @llvm.fshr.i8(i8 [[X:%.*]], i8 [[X]], i8 [[C:%.*]]) 211ce02652SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[X_RORR]], [[X]] 221ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 231ce02652SNoah Goldstein; 241ce02652SNoah Goldstein %x_rorr = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C) 251ce02652SNoah Goldstein %r = icmp ult i8 %x_rorr, %x 261ce02652SNoah Goldstein ret i1 %r 271ce02652SNoah Goldstein} 281ce02652SNoah Goldstein 291ce02652SNoah Goldsteindefine i1 @cmpeq_rorr_to_rorl_cmp_against_wrong_val_fail(i8 %x, i8 %C) { 301ce02652SNoah Goldstein; CHECK-LABEL: @cmpeq_rorr_to_rorl_cmp_against_wrong_val_fail( 311ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORR:%.*]] = call i8 @llvm.fshr.i8(i8 [[X:%.*]], i8 [[X]], i8 [[C:%.*]]) 321ce02652SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[X_RORR]], [[C]] 331ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 341ce02652SNoah Goldstein; 351ce02652SNoah Goldstein %x_rorr = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C) 361ce02652SNoah Goldstein %r = icmp ult i8 %x_rorr, %C 371ce02652SNoah Goldstein ret i1 %r 381ce02652SNoah Goldstein} 391ce02652SNoah Goldstein 401ce02652SNoah Goldsteindefine i1 @cmpeq_rorr_to_rorl_non_ror_fail(i8 %x, i8 %C) { 411ce02652SNoah Goldstein; CHECK-LABEL: @cmpeq_rorr_to_rorl_non_ror_fail( 421ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORR:%.*]] = call i8 @llvm.fshr.i8(i8 [[X:%.*]], i8 [[C:%.*]], i8 [[C]]) 431ce02652SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[X_RORR]], [[X]] 441ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 451ce02652SNoah Goldstein; 461ce02652SNoah Goldstein %x_rorr = call i8 @llvm.fshr.i8(i8 %x, i8 %C, i8 %C) 471ce02652SNoah Goldstein %r = icmp ult i8 %x_rorr, %x 481ce02652SNoah Goldstein ret i1 %r 491ce02652SNoah Goldstein} 501ce02652SNoah Goldstein 511ce02652SNoah Goldsteindefine i1 @cmpeq_rorr_to_rorl_multiuse_fail(i8 %x, i8 %C) { 521ce02652SNoah Goldstein; CHECK-LABEL: @cmpeq_rorr_to_rorl_multiuse_fail( 531ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORR:%.*]] = call i8 @llvm.fshr.i8(i8 [[X:%.*]], i8 [[X]], i8 [[C:%.*]]) 541ce02652SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[X_RORR]]) 551ce02652SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X_RORR]], [[X]] 561ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 571ce02652SNoah Goldstein; 581ce02652SNoah Goldstein %x_rorr = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C) 591ce02652SNoah Goldstein call void @use.i8(i8 %x_rorr) 601ce02652SNoah Goldstein %r = icmp eq i8 %x_rorr, %x 611ce02652SNoah Goldstein ret i1 %r 621ce02652SNoah Goldstein} 631ce02652SNoah Goldstein 641ce02652SNoah Goldsteindefine i1 @cmpne_rorr_rorr(i8 %x, i8 %C0, i8 %C1) { 651ce02652SNoah Goldstein; CHECK-LABEL: @cmpne_rorr_rorr( 662df63095SNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = sub i8 [[C0:%.*]], [[C1:%.*]] 675189eff3SNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 [[TMP1]]) 68*a1058776SNikita Popov; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[X]], [[TMP2]] 691ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 701ce02652SNoah Goldstein; 711ce02652SNoah Goldstein %x_rorr0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C0) 721ce02652SNoah Goldstein %x_rorr1 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C1) 731ce02652SNoah Goldstein %r = icmp ne i8 %x_rorr0, %x_rorr1 741ce02652SNoah Goldstein ret i1 %r 751ce02652SNoah Goldstein} 761ce02652SNoah Goldstein 771ce02652SNoah Goldsteindefine i1 @cmpne_rorrX_rorrY(i8 %x, i8 %y, i8 %C0, i8 %C1) { 781ce02652SNoah Goldstein; CHECK-LABEL: @cmpne_rorrX_rorrY( 792df63095SNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = sub i8 [[C0:%.*]], [[C1:%.*]] 802df63095SNoah Goldstein; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.fshr.i8(i8 [[X:%.*]], i8 [[X]], i8 [[TMP1]]) 81*a1058776SNikita Popov; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[Y:%.*]], [[TMP2]] 821ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 831ce02652SNoah Goldstein; 841ce02652SNoah Goldstein %x_rorr0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C0) 851ce02652SNoah Goldstein %y_rorr1 = call i8 @llvm.fshr.i8(i8 %y, i8 %y, i8 %C1) 861ce02652SNoah Goldstein %r = icmp ne i8 %x_rorr0, %y_rorr1 871ce02652SNoah Goldstein ret i1 %r 881ce02652SNoah Goldstein} 891ce02652SNoah Goldstein 901ce02652SNoah Goldstein 911ce02652SNoah Goldsteindefine i1 @cmpne_rorr_rorr_non_equality_fail(i8 %x, i8 %C0, i8 %C1) { 921ce02652SNoah Goldstein; CHECK-LABEL: @cmpne_rorr_rorr_non_equality_fail( 931ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORR0:%.*]] = call i8 @llvm.fshr.i8(i8 [[X:%.*]], i8 [[X]], i8 [[C0:%.*]]) 941ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORR1:%.*]] = call i8 @llvm.fshr.i8(i8 [[X]], i8 [[X]], i8 [[C1:%.*]]) 951ce02652SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[X_RORR0]], [[X_RORR1]] 961ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 971ce02652SNoah Goldstein; 981ce02652SNoah Goldstein %x_rorr0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C0) 991ce02652SNoah Goldstein %x_rorr1 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C1) 1001ce02652SNoah Goldstein %r = icmp sge i8 %x_rorr0, %x_rorr1 1011ce02652SNoah Goldstein ret i1 %r 1021ce02652SNoah Goldstein} 1031ce02652SNoah Goldstein 1041ce02652SNoah Goldstein 1051ce02652SNoah Goldsteindefine i1 @cmpne_rorr_rorl_todo_mismatch_C(i8 %x, i8 %C0, i8 %C1) { 1061ce02652SNoah Goldstein; CHECK-LABEL: @cmpne_rorr_rorl_todo_mismatch_C( 1071ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORR0:%.*]] = call i8 @llvm.fshr.i8(i8 [[X:%.*]], i8 [[X]], i8 [[C0:%.*]]) 1081ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORL1:%.*]] = call i8 @llvm.fshl.i8(i8 [[X]], i8 [[X]], i8 3) 1091ce02652SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[X_RORR0]], [[X_RORL1]] 1101ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1111ce02652SNoah Goldstein; 1121ce02652SNoah Goldstein %x_rorr0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %C0) 1131ce02652SNoah Goldstein %x_rorl1 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 3) 1141ce02652SNoah Goldstein %r = icmp ne i8 %x_rorr0, %x_rorl1 1151ce02652SNoah Goldstein ret i1 %r 1161ce02652SNoah Goldstein} 1171ce02652SNoah Goldstein 1181ce02652SNoah Goldsteindefine i1 @cmpne_rorl_rorl_multiuse1_fail(i8 %x, i8 %C0) { 1191ce02652SNoah Goldstein; CHECK-LABEL: @cmpne_rorl_rorl_multiuse1_fail( 1201ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORL0:%.*]] = call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 [[C0:%.*]]) 1211ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORL1:%.*]] = call i8 @llvm.fshl.i8(i8 [[X]], i8 [[X]], i8 3) 1221ce02652SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[X_RORL1]]) 1231ce02652SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[X_RORL0]], [[X_RORL1]] 1241ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1251ce02652SNoah Goldstein; 1261ce02652SNoah Goldstein %x_rorl0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %C0) 1271ce02652SNoah Goldstein %x_rorl1 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 3) 1281ce02652SNoah Goldstein call void @use.i8(i8 %x_rorl1) 1291ce02652SNoah Goldstein %r = icmp ne i8 %x_rorl0, %x_rorl1 1301ce02652SNoah Goldstein ret i1 %r 1311ce02652SNoah Goldstein} 1321ce02652SNoah Goldstein 1331ce02652SNoah Goldsteindefine i1 @cmpeq_rorlXC_rorlYC_multiuse1(i8 %x, i8 %y) { 1341ce02652SNoah Goldstein; CHECK-LABEL: @cmpeq_rorlXC_rorlYC_multiuse1( 1351ce02652SNoah Goldstein; CHECK-NEXT: [[Y_RORL1:%.*]] = call i8 @llvm.fshl.i8(i8 [[Y:%.*]], i8 [[Y]], i8 3) 1361ce02652SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[Y_RORL1]]) 1372df63095SNoah Goldstein; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 3) 138*a1058776SNikita Popov; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Y]], [[TMP1]] 1391ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1401ce02652SNoah Goldstein; 1411ce02652SNoah Goldstein %x_rorl0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 6) 1421ce02652SNoah Goldstein %y_rorl1 = call i8 @llvm.fshl.i8(i8 %y, i8 %y, i8 3) 1431ce02652SNoah Goldstein call void @use.i8(i8 %y_rorl1) 1441ce02652SNoah Goldstein %r = icmp eq i8 %x_rorl0, %y_rorl1 1451ce02652SNoah Goldstein ret i1 %r 1461ce02652SNoah Goldstein} 1471ce02652SNoah Goldstein 1481ce02652SNoah Goldsteindefine i1 @cmpeq_rorlC_rorlC_multiuse2_fail(i8 %x) { 1491ce02652SNoah Goldstein; CHECK-LABEL: @cmpeq_rorlC_rorlC_multiuse2_fail( 1501ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORL0:%.*]] = call i8 @llvm.fshl.i8(i8 [[X:%.*]], i8 [[X]], i8 6) 1511ce02652SNoah Goldstein; CHECK-NEXT: [[X_RORL1:%.*]] = call i8 @llvm.fshl.i8(i8 [[X]], i8 [[X]], i8 3) 1521ce02652SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[X_RORL0]]) 1531ce02652SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[X_RORL1]]) 1541ce02652SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X_RORL0]], [[X_RORL1]] 1551ce02652SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 1561ce02652SNoah Goldstein; 1571ce02652SNoah Goldstein %x_rorl0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 6) 1581ce02652SNoah Goldstein %x_rorl1 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 3) 1591ce02652SNoah Goldstein call void @use.i8(i8 %x_rorl0) 1601ce02652SNoah Goldstein call void @use.i8(i8 %x_rorl1) 1611ce02652SNoah Goldstein %r = icmp eq i8 %x_rorl0, %x_rorl1 1621ce02652SNoah Goldstein ret i1 %r 1631ce02652SNoah Goldstein} 164