191 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; https://alive2.llvm.org/ce/z/5eCiWi5define i8 @urem_assume(i8 %x, i8 %n) {6; CHECK-LABEL: define i8 @urem_assume(7; CHECK-SAME: i8 [[X:%.*]], i8 [[N:%.*]]) {8; CHECK-NEXT: [[X_FR:%.*]] = freeze i8 [[X]]9; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X_FR]], [[N]]10; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])11; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X_FR]], 112; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[ADD]], [[N]]13; CHECK-NEXT: [[OUT:%.*]] = select i1 [[TMP1]], i8 0, i8 [[ADD]]14; CHECK-NEXT: ret i8 [[OUT]]15;16 %cmp = icmp ult i8 %x, %n17 tail call void @llvm.assume(i1 %cmp)18 %add = add nuw i8 %x, 119 %out = urem i8 %add, %n20 ret i8 %out21}22 23; https://alive2.llvm.org/ce/z/MGgtYN24define i8 @urem_assume_without_nuw(i8 %x, i8 %n) {25; CHECK-LABEL: define i8 @urem_assume_without_nuw(26; CHECK-SAME: i8 [[X:%.*]], i8 [[N:%.*]]) {27; CHECK-NEXT: [[X_FR:%.*]] = freeze i8 [[X]]28; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X_FR]], [[N]]29; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])30; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X_FR]], 131; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[ADD]], [[N]]32; CHECK-NEXT: [[OUT:%.*]] = select i1 [[TMP1]], i8 0, i8 [[ADD]]33; CHECK-NEXT: ret i8 [[OUT]]34;35 %cmp = icmp ult i8 %x, %n36 tail call void @llvm.assume(i1 %cmp)37 %add = add i8 %x, 138 %out = urem i8 %add, %n39 ret i8 %out40}41 42; Negative test: The assume is false43define i8 @urem_assume_eq(i8 %x, i8 %n) {44; CHECK-LABEL: define i8 @urem_assume_eq(45; CHECK-SAME: i8 [[X:%.*]], i8 [[N:%.*]]) {46; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[N]]47; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])48; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 149; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]50; CHECK-NEXT: ret i8 [[OUT]]51;52 %cmp = icmp eq i8 %x, %n53 tail call void @llvm.assume(i1 %cmp)54 %add = add i8 %x, 155 %out = urem i8 %add, %n56 ret i8 %out57}58 59; Negative test: The assume is false60define i8 @urem_assume_ne(i8 %x, i8 %n) {61; CHECK-LABEL: define i8 @urem_assume_ne(62; CHECK-SAME: i8 [[X:%.*]], i8 [[N:%.*]]) {63; CHECK-NEXT: [[START:.*:]]64; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X]], [[N]]65; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])66; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 167; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]68; CHECK-NEXT: ret i8 [[OUT]]69;70start:71 %cmp = icmp ne i8 %x, %n72 tail call void @llvm.assume(i1 %cmp)73 %add = add i8 %x, 174 %out = urem i8 %add, %n75 ret i8 %out76}77 78; Negative test: The add constant is not 179define i8 @urem_assume_with_unexpected_const(i8 %x, i8 %n) {80; CHECK-LABEL: define i8 @urem_assume_with_unexpected_const(81; CHECK-SAME: i8 [[X:%.*]], i8 [[N:%.*]]) {82; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X]], [[N]]83; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])84; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 285; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]86; CHECK-NEXT: ret i8 [[OUT]]87;88 %cmp = icmp ult i8 %x, %n89 tail call void @llvm.assume(i1 %cmp)90 %add = add i8 %x, 2 ; Transform only when the constant is 191 %out = urem i8 %add, %n92 ret i8 %out93}94 95; https://alive2.llvm.org/ce/z/gNhZ2x96define i8 @urem_without_assume(i8 %arg, i8 %arg2) {97; CHECK-LABEL: define i8 @urem_without_assume(98; CHECK-SAME: i8 [[ARG:%.*]], i8 [[ARG2:%.*]]) {99; CHECK-NEXT: [[ARG2_FR:%.*]] = freeze i8 [[ARG2]]100; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i8 [[ARG]]101; CHECK-NEXT: [[X_FR:%.*]] = urem i8 [[ARG_FR]], [[ARG2_FR]]102; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X_FR]], 1103; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[ADD]], [[ARG2_FR]]104; CHECK-NEXT: [[OUT:%.*]] = select i1 [[TMP1]], i8 0, i8 [[ADD]]105; CHECK-NEXT: ret i8 [[OUT]]106;107 %x = urem i8 %arg, %arg2108 %add = add i8 %x, 1109 %out = urem i8 %add, %arg2110 ret i8 %out111}112 113; https://alive2.llvm.org/ce/z/eHkgRa114define i8 @urem_with_dominating_condition(i8 %x, i8 %n) {115; CHECK-LABEL: define i8 @urem_with_dominating_condition(116; CHECK-SAME: i8 [[X:%.*]], i8 [[N:%.*]]) {117; CHECK-NEXT: [[START:.*:]]118; CHECK-NEXT: [[X_FR:%.*]] = freeze i8 [[X]]119; CHECK-NEXT: [[COND:%.*]] = icmp ult i8 [[X_FR]], [[N]]120; CHECK-NEXT: br i1 [[COND]], [[DOTBB0:label %.*]], [[DOTBB1:label %.*]]121; CHECK: [[_BB0:.*:]]122; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X_FR]], 1123; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i8 [[ADD]], [[N]]124; CHECK-NEXT: [[OUT:%.*]] = select i1 [[TMP0]], i8 0, i8 [[ADD]]125; CHECK-NEXT: ret i8 [[OUT]]126; CHECK: [[_BB1:.*:]]127; CHECK-NEXT: ret i8 0128;129start:130 %cond = icmp ult i8 %x, %n131 br i1 %cond, label %.bb0, label %.bb1 ; Should also works for a dominating condition132.bb0:133 %add = add i8 %x, 1134 %out = urem i8 %add, %n135 ret i8 %out136.bb1:137 ret i8 0138}139 140; Revert the dominating condition and target branch at the same time.141define i8 @urem_with_dominating_condition_false(i8 %x, i8 %n) {142; CHECK-LABEL: define i8 @urem_with_dominating_condition_false(143; CHECK-SAME: i8 [[X:%.*]], i8 [[N:%.*]]) {144; CHECK-NEXT: [[START:.*:]]145; CHECK-NEXT: [[X_FR:%.*]] = freeze i8 [[X]]146; CHECK-NEXT: [[COND_NOT:%.*]] = icmp ult i8 [[X_FR]], [[N]]147; CHECK-NEXT: br i1 [[COND_NOT]], [[DOTBB0:label %.*]], [[DOTBB1:label %.*]]148; CHECK: [[_BB0:.*:]]149; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X_FR]], 1150; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i8 [[ADD]], [[N]]151; CHECK-NEXT: [[OUT:%.*]] = select i1 [[TMP0]], i8 0, i8 [[ADD]]152; CHECK-NEXT: ret i8 [[OUT]]153; CHECK: [[_BB1:.*:]]154; CHECK-NEXT: ret i8 0155;156start:157 %cond = icmp uge i8 %x, %n158 br i1 %cond, label %.bb1, label %.bb0 ; Swap the branch targets159.bb0:160 %add = add i8 %x, 1161 %out = urem i8 %add, %n162 ret i8 %out163.bb1:164 ret i8 0165}166 167; Negative test168define noundef i8 @urem_with_opposite_condition(i8 %x, i8 %n) {169; CHECK-LABEL: define noundef i8 @urem_with_opposite_condition(170; CHECK-SAME: i8 [[X:%.*]], i8 [[N:%.*]]) {171; CHECK-NEXT: [[COND:%.*]] = icmp ult i8 [[X]], [[N]]172; CHECK-NEXT: br i1 [[COND]], [[DOTBB1:label %.*]], [[DOTBB0:label %.*]]173; CHECK: [[_BB0:.*:]]174; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 1175; CHECK-NEXT: [[OUT:%.*]] = urem i8 [[ADD]], [[N]]176; CHECK-NEXT: ret i8 [[OUT]]177; CHECK: [[_BB1:.*:]]178; CHECK-NEXT: ret i8 0179;180 %cond = icmp ult i8 %x, %n181 br i1 %cond, label %.bb1, label %.bb0 ; Revert the condition182.bb0:183 %add = add i8 %x, 1184 %out = urem i8 %add, %n185 ret i8 %out186.bb1:187 ret i8 0188}189 190declare void @llvm.assume(i1 noundef)191