brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · 81e35da Raw
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