xref: /llvm-project/llvm/test/Transforms/InstCombine/icmp-equality-rotate.ll (revision a105877646d68e48cdeeeadd9d1e075dc3c5d68d)
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