brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.1 KiB · fb13417 Raw
390 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 32; RUN: opt -p constraint-elimination -S %s | FileCheck %s3 4declare void @llvm.assume(i1)5 6define i1 @addition_with_extra_facts_and_args_ult_i64(i64 noundef %a, i64 noundef %b, i64 noundef %c) {7; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_i64(8; CHECK-SAME: i64 noundef [[A:%.*]], i64 noundef [[B:%.*]], i64 noundef [[C:%.*]]) {9; CHECK-NEXT:  entry:10; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i64 [[A]], 204811; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])12; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i64 [[B]], 102413; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])14; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i64 [[B]], [[A]]15; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i64 [[ADD]], [[C]]16; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])17; CHECK-NEXT:    ret i1 true18;19entry:20  %cmp.a = icmp ule i64 %a, 204821  call void @llvm.assume(i1 %cmp.a)22  %cmp.b = icmp ule i64 %b, 102423  call void @llvm.assume(i1 %cmp.b)24  %add = add nuw nsw i64 %b, %a25  %cmp.add = icmp ult i64 %add, %c26  call void @llvm.assume(i1 %cmp.add)27  %t = icmp ult i64 %a, %c28  ret i1 %t29}30 31define i1 @addition_with_extra_facts_and_args_ult_1(i16 noundef %a, i16 noundef %b, i16 noundef %c) {32; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_1(33; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {34; CHECK-NEXT:  entry:35; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i16 [[A]], 204836; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])37; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i16 [[B]], 102438; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])39; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]40; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]41; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])42; CHECK-NEXT:    ret i1 true43;44entry:45  %cmp.a = icmp ule i16 %a, 204846  call void @llvm.assume(i1 %cmp.a)47  %cmp.b = icmp ule i16 %b, 102448  call void @llvm.assume(i1 %cmp.b)49  %add = add nuw nsw i16 %b, %a50  %cmp.add = icmp ult i16 %add, %c51  call void @llvm.assume(i1 %cmp.add)52  %t = icmp ult i16 %a, %c53  ret i1 %t54}55 56define i1 @addition_with_extra_facts_and_args_ult_2(i16 noundef %a, i16 noundef %b, i16 noundef %c) {57; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_2(58; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {59; CHECK-NEXT:  entry:60; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i16 [[A]], 204861; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])62; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i16 [[B]], 102463; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])64; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]65; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]66; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])67; CHECK-NEXT:    ret i1 true68;69entry:70  %cmp.a = icmp ule i16 %a, 204871  call void @llvm.assume(i1 %cmp.a)72  %cmp.b = icmp ule i16 %b, 102473  call void @llvm.assume(i1 %cmp.b)74  %add = add nuw nsw i16 %b, %a75  %cmp.add = icmp ult i16 %add, %c76  call void @llvm.assume(i1 %cmp.add)77  %t = icmp ult i16 %b, %c78  ret i1 %t79}80 81define i1 @addition_with_extra_facts_and_args_ult_3(i16 noundef %a, i16 noundef %b, i16 noundef %c) {82; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_3(83; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {84; CHECK-NEXT:  entry:85; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i16 [[A]], 204886; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])87; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i16 [[B]], 102488; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])89; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]90; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]91; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])92; CHECK-NEXT:    ret i1 false93;94entry:95  %cmp.a = icmp ule i16 %a, 204896  call void @llvm.assume(i1 %cmp.a)97  %cmp.b = icmp ule i16 %b, 102498  call void @llvm.assume(i1 %cmp.b)99  %add = add nuw nsw i16 %b, %a100  %cmp.add = icmp ult i16 %add, %c101  call void @llvm.assume(i1 %cmp.add)102  %f = icmp uge i16 %a, %c103  ret i1 %f104}105 106define i1 @addition_with_extra_facts_and_args_ult_4(i16 noundef %a, i16 noundef %b, i16 noundef %c) {107; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_4(108; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {109; CHECK-NEXT:  entry:110; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048111; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])112; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024113; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])114; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]115; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]116; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])117; CHECK-NEXT:    ret i1 false118;119entry:120  %cmp.a = icmp ule i16 %a, 2048121  call void @llvm.assume(i1 %cmp.a)122  %cmp.b = icmp ule i16 %b, 1024123  call void @llvm.assume(i1 %cmp.b)124  %add = add nuw nsw i16 %b, %a125  %cmp.add = icmp ult i16 %add, %c126  call void @llvm.assume(i1 %cmp.add)127  %f = icmp uge i16 %b, %c128  ret i1 %f129}130 131define i1 @addition_with_extra_facts_and_args_ult_5(i16 noundef %a, i16 noundef %b, i16 noundef %c) {132; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_5(133; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {134; CHECK-NEXT:  entry:135; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048136; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])137; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024138; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])139; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]140; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]141; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])142; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[A]], 10143; CHECK-NEXT:    ret i1 [[CMP]]144;145entry:146  %cmp.a = icmp ule i16 %a, 2048147  call void @llvm.assume(i1 %cmp.a)148  %cmp.b = icmp ule i16 %b, 1024149  call void @llvm.assume(i1 %cmp.b)150  %add = add nuw nsw i16 %b, %a151  %cmp.add = icmp ult i16 %add, %c152  call void @llvm.assume(i1 %cmp.add)153  %cmp = icmp uge i16 %a, 10154  ret i1 %cmp155}156 157define i1 @addition_with_extra_facts_and_args_ult_6(i16 noundef %a, i16 noundef %b, i16 noundef %c) {158; CHECK-LABEL: define i1 @addition_with_extra_facts_and_args_ult_6(159; CHECK-SAME: i16 noundef [[A:%.*]], i16 noundef [[B:%.*]], i16 noundef [[C:%.*]]) {160; CHECK-NEXT:  entry:161; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048162; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])163; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024164; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])165; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]166; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]167; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])168; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[A]], [[B]]169; CHECK-NEXT:    ret i1 [[CMP]]170;171entry:172  %cmp.a = icmp ule i16 %a, 2048173  call void @llvm.assume(i1 %cmp.a)174  %cmp.b = icmp ule i16 %b, 1024175  call void @llvm.assume(i1 %cmp.b)176  %add = add nuw nsw i16 %b, %a177  %cmp.add = icmp ult i16 %add, %c178  call void @llvm.assume(i1 %cmp.add)179  %cmp = icmp ult i16 %a, %b180  ret i1 %cmp181}182 183 184declare i16 @get()185 186define i1 @addition_with_extra_facts_and_return_value_ult_1() {187; CHECK-LABEL: define i1 @addition_with_extra_facts_and_return_value_ult_1() {188; CHECK-NEXT:  entry:189; CHECK-NEXT:    [[A:%.*]] = call i16 @get()190; CHECK-NEXT:    [[B:%.*]] = call i16 @get()191; CHECK-NEXT:    [[C:%.*]] = call i16 @get()192; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048193; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])194; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024195; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])196; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]197; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]198; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])199; CHECK-NEXT:    ret i1 true200;201entry:202  %a = call i16 @get()203  %b = call i16 @get()204  %c = call i16 @get()205  %cmp.a = icmp ule i16 %a, 2048206  call void @llvm.assume(i1 %cmp.a)207  %cmp.b = icmp ule i16 %b, 1024208  call void @llvm.assume(i1 %cmp.b)209  %add = add nuw nsw i16 %b, %a210  %cmp.add = icmp ult i16 %add, %c211  call void @llvm.assume(i1 %cmp.add)212  %t = icmp ult i16 %a, %c213  ret i1 %t214}215 216define i1 @addition_with_extra_facts_and_return_value_ult_2() {217; CHECK-LABEL: define i1 @addition_with_extra_facts_and_return_value_ult_2() {218; CHECK-NEXT:  entry:219; CHECK-NEXT:    [[A:%.*]] = call i16 @get()220; CHECK-NEXT:    [[B:%.*]] = call i16 @get()221; CHECK-NEXT:    [[C:%.*]] = call i16 @get()222; CHECK-NEXT:    [[CMP_A:%.*]] = icmp ule i16 [[A]], 2048223; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_A]])224; CHECK-NEXT:    [[CMP_B:%.*]] = icmp ule i16 [[B]], 1024225; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_B]])226; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]227; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]228; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])229; CHECK-NEXT:    ret i1 false230;231entry:232  %a = call i16 @get()233  %b = call i16 @get()234  %c = call i16 @get()235  %cmp.a = icmp ule i16 %a, 2048236  call void @llvm.assume(i1 %cmp.a)237  %cmp.b = icmp ule i16 %b, 1024238  call void @llvm.assume(i1 %cmp.b)239  %add = add nuw nsw i16 %b, %a240  %cmp.add = icmp ult i16 %add, %c241  call void @llvm.assume(i1 %cmp.add)242  %f = icmp uge i16 %a, %c243  ret i1 %f244}245 246define i1 @addition_no_extra_facts_with_return_value_ult_1() {247; CHECK-LABEL: define i1 @addition_no_extra_facts_with_return_value_ult_1() {248; CHECK-NEXT:  entry:249; CHECK-NEXT:    [[A:%.*]] = call i16 @get()250; CHECK-NEXT:    [[B:%.*]] = call i16 @get()251; CHECK-NEXT:    [[C:%.*]] = call i16 @get()252; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]253; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]254; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])255; CHECK-NEXT:    ret i1 true256;257entry:258  %a = call i16 @get()259  %b = call i16 @get()260  %c = call i16 @get()261  %add = add nuw nsw i16 %b, %a262  %cmp.add = icmp ult i16 %add, %c263  call void @llvm.assume(i1 %cmp.add)264  %t = icmp ult i16 %a, %c265  ret i1 %t266}267 268define i1 @addition_no_extra_facts_with_return_value_ult_2() {269; CHECK-LABEL: define i1 @addition_no_extra_facts_with_return_value_ult_2() {270; CHECK-NEXT:  entry:271; CHECK-NEXT:    [[A:%.*]] = call i16 @get()272; CHECK-NEXT:    [[B:%.*]] = call i16 @get()273; CHECK-NEXT:    [[C:%.*]] = call i16 @get()274; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]275; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]276; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])277; CHECK-NEXT:    ret i1 false278;279entry:280  %a = call i16 @get()281  %b = call i16 @get()282  %c = call i16 @get()283  %add = add nuw nsw i16 %b, %a284  %cmp.add = icmp ult i16 %add, %c285  call void @llvm.assume(i1 %cmp.add)286  %f = icmp uge i16 %a, %c287  ret i1 %f288}289 290define i1 @addition_no_extra_facts_with_return_value_ult_3() {291; CHECK-LABEL: define i1 @addition_no_extra_facts_with_return_value_ult_3() {292; CHECK-NEXT:  entry:293; CHECK-NEXT:    [[A:%.*]] = call i16 @get()294; CHECK-NEXT:    [[B:%.*]] = call i16 @get()295; CHECK-NEXT:    [[C:%.*]] = call i16 @get()296; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]]297; CHECK-NEXT:    [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]]298; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ADD]])299; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[A]], 9300; CHECK-NEXT:    ret i1 [[CMP]]301;302entry:303  %a = call i16 @get()304  %b = call i16 @get()305  %c = call i16 @get()306  %add = add nuw nsw i16 %b, %a307  %cmp.add = icmp ult i16 %add, %c308  call void @llvm.assume(i1 %cmp.add)309  %cmp = icmp uge i16 %a, 9310  ret i1 %cmp311}312 313; Test for https://github.com/llvm/llvm-project/issues/63490.314define i1 @assume_x_ugt_y_plus_y_via_shl_eq(i8 %x, i8 %y) {315; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_shl_eq(316; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {317; CHECK-NEXT:    [[S:%.*]] = shl nuw i8 [[Y]], 1318; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]319; CHECK-NEXT:    tail call void @llvm.assume(i1 [[C_1]])320; CHECK-NEXT:    ret i1 false321;322  %s = shl nuw i8 %y, 1323  %c.1 = icmp ugt i8 %x, %s324  tail call void @llvm.assume(i1 %c.1)325  %c.2 = icmp eq i8 %x, %y326  ret i1 %c.2327}328 329define i1 @assume_x_ugt_y_plus_y_via_shl_eq_no_nuw(i8 %x, i8 %y) {330; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_shl_eq_no_nuw(331; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {332; CHECK-NEXT:    [[S:%.*]] = shl i8 [[Y]], 1333; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]334; CHECK-NEXT:    tail call void @llvm.assume(i1 [[C_1]])335; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i8 [[X]], [[Y]]336; CHECK-NEXT:    ret i1 [[C_2]]337;338  %s = shl i8 %y, 1339  %c.1 = icmp ugt i8 %x, %s340  tail call void @llvm.assume(i1 %c.1)341  %c.2 = icmp eq i8 %x, %y342  ret i1 %c.2343}344 345define i1 @assume_x_ugt_y_plus_y_via_add_eq(i8 %x, i8 %y) {346; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_add_eq(347; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {348; CHECK-NEXT:    [[S:%.*]] = add nuw i8 [[Y]], [[Y]]349; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]350; CHECK-NEXT:    tail call void @llvm.assume(i1 [[C_1]])351; CHECK-NEXT:    ret i1 false352;353  %s = add nuw i8 %y, %y354  %c.1 = icmp ugt i8 %x, %s355  tail call void @llvm.assume(i1 %c.1)356  %c.2 = icmp eq i8 %x, %y357  ret i1 %c.2358}359 360define i1 @assume_x_ugt_y_plus_y_via_add_eq_no_nuw(i8 %x, i8 %y) {361; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_add_eq_no_nuw(362; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {363; CHECK-NEXT:    [[S:%.*]] = add i8 [[Y]], [[Y]]364; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]365; CHECK-NEXT:    tail call void @llvm.assume(i1 [[C_1]])366; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i8 [[X]], [[Y]]367; CHECK-NEXT:    ret i1 [[C_2]]368;369  %s = add i8 %y, %y370  %c.1 = icmp ugt i8 %x, %s371  tail call void @llvm.assume(i1 %c.1)372  %c.2 = icmp eq i8 %x, %y373  ret i1 %c.2374}375 376define i1 @assume_x_ugt_y_plus_y_via_shl_ne(i8 %x, i8 %y) {377; CHECK-LABEL: define i1 @assume_x_ugt_y_plus_y_via_shl_ne(378; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {379; CHECK-NEXT:    [[S:%.*]] = shl nuw i8 [[Y]], 1380; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]]381; CHECK-NEXT:    tail call void @llvm.assume(i1 [[C_1]])382; CHECK-NEXT:    ret i1 true383;384  %s = shl nuw i8 %y, 1385  %c.1 = icmp ugt i8 %x, %s386  tail call void @llvm.assume(i1 %c.1)387  %c.2 = icmp ne i8 %x, %y388  ret i1 %c.2389}390