brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.7 KiB · 4753860 Raw
426 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare void @llvm.assume(i1)5 6define i1 @test_eq_ne_0(i8 %a, i8 %b) {7; CHECK-LABEL: @test_eq_ne_0(8; CHECK-NEXT:  entry:9; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 010; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]11; CHECK:       then:12; CHECK-NEXT:    [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]]13; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 false, true14; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]15; CHECK-NEXT:    ret i1 [[RES_2]]16; CHECK:       else:17; CHECK-NEXT:    [[C_3:%.*]] = icmp ne i8 [[A]], 118; CHECK-NEXT:    [[C_4:%.*]] = icmp ne i8 [[A]], [[B]]19; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 true, [[C_3]]20; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]21; CHECK-NEXT:    ret i1 [[RES_4]]22;23entry:24  %cmp = icmp eq i8 %a, 025  br i1 %cmp, label %then, label %else26 27then:28  %f.1 = icmp ne i8 %a, 029  %c.1 = icmp ne i8 %a, 130  %c.2 = icmp ne i8 %a, %b31  %res.1 = xor i1 %f.1, %c.132  %res.2 = xor i1 %res.1, %c.233  ret i1 %res.234 35else:36  %t.1 = icmp ne i8 %a, 037  %c.3 = icmp ne i8 %a, 138  %c.4 = icmp ne i8 %a, %b39  %res.3 = xor i1 %t.1, %c.340  %res.4 = xor i1 %res.3, %c.441  ret i1 %res.442}43 44define i1 @test_ne_eq_0(i8 %a, i8 %b) {45; CHECK-LABEL: @test_ne_eq_0(46; CHECK-NEXT:  entry:47; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[A:%.*]], 048; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]49; CHECK:       then:50; CHECK-NEXT:    [[C_1:%.*]] = icmp ne i8 [[A]], 151; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]52; CHECK-NEXT:    [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]]53; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]54; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i8 [[A]], [[B]]55; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]]56; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], false57; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], true58; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], true59; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[A]], 160; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_5]]61; CHECK-NEXT:    [[C_6:%.*]] = icmp sgt i8 [[A]], 062; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_6]]63; CHECK-NEXT:    ret i1 [[RES_8]]64; CHECK:       else:65; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 false, true66; CHECK-NEXT:    [[C_8:%.*]] = icmp ne i8 [[A]], [[B]]67; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_8]]68; CHECK-NEXT:    [[C_9:%.*]] = icmp eq i8 [[A]], [[B]]69; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_9]]70; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], true71; CHECK-NEXT:    [[RES_13:%.*]] = xor i1 [[RES_12]], false72; CHECK-NEXT:    [[RES_14:%.*]] = xor i1 [[RES_13]], false73; CHECK-NEXT:    [[RES_15:%.*]] = xor i1 [[RES_14]], false74; CHECK-NEXT:    [[RES_16:%.*]] = xor i1 [[RES_15]], false75; CHECK-NEXT:    ret i1 [[RES_16]]76;77entry:78  %cmp = icmp ne i8 %a, 079  br i1 %cmp, label %then, label %else80 81then:82  %t.1 = icmp ne i8 %a, 083  %c.1 = icmp ne i8 %a, 184  %res.1 = xor i1 %t.1, %c.185 86  %c.2 = icmp ne i8 %a, %b87  %res.2 = xor i1 %res.1, %c.288 89  %c.3 = icmp eq i8 %a, %b90  %res.3 = xor i1 %res.2, %c.391 92  %c.4 = icmp eq i8 %a, 093  %res.4 = xor i1 %res.3, %c.494 95  %t.2 = icmp ugt i8 %a, 096  %res.5 = xor i1 %res.4, %t.297 98  %t.3 = icmp uge i8 %a, 199  %res.6 = xor i1 %res.5, %t.3100 101  %c.5 = icmp ugt i8 %a, 1102  %res.7 = xor i1 %res.6, %c.5103 104  %c.6 = icmp sgt i8 %a, 0105  %res.8 = xor i1 %res.7, %c.6106 107  ret i1 %res.8108 109else:110  %f.1 = icmp ne i8 %a, 0111  %c.7 = icmp ne i8 %a, 1112  %res.9 = xor i1 %f.1, %c.7113 114  %c.8 = icmp ne i8 %a, %b115  %res.10 = xor i1 %res.9, %c.8116 117  %c.9 = icmp eq i8 %a, %b118  %res.11 = xor i1 %res.10, %c.9119 120  %c.10 = icmp eq i8 %a, 0121  %res.12 = xor i1 %res.11, %c.10122 123  %f.2 = icmp ugt i8 %a, 0124  %res.13 = xor i1 %res.12, %f.2125 126  %f.3 = icmp uge i8 %a, 1127  %res.14 = xor i1 %res.13, %f.3128 129  %c.11 = icmp ugt i8 %a, 1130  %res.15 = xor i1 %res.14, %c.11131 132  %c.12 = icmp sgt i8 %a, 0133  %res.16 = xor i1 %res.15, %c.12134 135  ret i1 %res.16136}137 138define i1 @test_eq_ne_1(i8 %a, i8 %b) {139; CHECK-LABEL: @test_eq_ne_1(140; CHECK-NEXT:  entry:141; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 1142; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]143; CHECK:       then:144; CHECK-NEXT:    [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]]145; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, false146; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]147; CHECK-NEXT:    ret i1 [[RES_2]]148; CHECK:       else:149; CHECK-NEXT:    [[T_1:%.*]] = icmp ne i8 [[A]], 0150; CHECK-NEXT:    [[C_3:%.*]] = icmp ne i8 [[A]], 1151; CHECK-NEXT:    [[C_4:%.*]] = icmp ne i8 [[A]], [[B]]152; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[T_1]], [[C_3]]153; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]154; CHECK-NEXT:    ret i1 [[RES_4]]155;156entry:157  %cmp = icmp eq i8 %a, 1158  br i1 %cmp, label %then, label %else159 160then:161  %f.1 = icmp ne i8 %a, 0162  %c.1 = icmp ne i8 %a, 1163  %c.2 = icmp ne i8 %a, %b164  %res.1 = xor i1 %f.1, %c.1165  %res.2 = xor i1 %res.1, %c.2166  ret i1 %res.2167 168else:169  %t.1 = icmp ne i8 %a, 0170  %c.3 = icmp ne i8 %a, 1171  %c.4 = icmp ne i8 %a, %b172  %res.3 = xor i1 %t.1, %c.3173  %res.4 = xor i1 %res.3, %c.4174  ret i1 %res.4175}176 177define i1 @test_ne_eq_1(i8 %a, i8 %b) {178; CHECK-LABEL: @test_ne_eq_1(179; CHECK-NEXT:  entry:180; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[A:%.*]], 1181; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]182; CHECK:       then:183; CHECK-NEXT:    [[T_1:%.*]] = icmp ne i8 [[A]], 1184; CHECK-NEXT:    [[C_1:%.*]] = icmp ne i8 [[A]], 0185; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]186; CHECK-NEXT:    [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]]187; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]188; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i8 [[A]], [[B]]189; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]]190; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i8 [[A]], 0191; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]192; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[A]], 0193; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], [[C_5]]194; CHECK-NEXT:    [[C_6:%.*]] = icmp uge i8 [[A]], 1195; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[C_6]]196; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i8 [[A]], 1197; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_5]]198; CHECK-NEXT:    [[C_8:%.*]] = icmp sgt i8 [[A]], 0199; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_6]]200; CHECK-NEXT:    ret i1 [[RES_8]]201; CHECK:       else:202; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 true, false203; CHECK-NEXT:    [[C_10:%.*]] = icmp ne i8 [[A]], [[B]]204; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_10]]205; CHECK-NEXT:    [[C_11:%.*]] = icmp eq i8 [[A]], [[B]]206; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_11]]207; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], false208; CHECK-NEXT:    [[RES_13:%.*]] = xor i1 [[RES_12]], true209; CHECK-NEXT:    [[RES_14:%.*]] = xor i1 [[RES_13]], true210; CHECK-NEXT:    [[RES_15:%.*]] = xor i1 [[RES_14]], false211; CHECK-NEXT:    [[RES_16:%.*]] = xor i1 [[RES_15]], true212; CHECK-NEXT:    ret i1 [[RES_16]]213;214entry:215  %cmp = icmp ne i8 %a, 1216  br i1 %cmp, label %then, label %else217 218then:219  %t.1 = icmp ne i8 %a, 1220  %c.1 = icmp ne i8 %a, 0221  %res.1 = xor i1 %t.1, %c.1222 223  %c.2 = icmp ne i8 %a, %b224  %res.2 = xor i1 %res.1, %c.2225 226  %c.3 = icmp eq i8 %a, %b227  %res.3 = xor i1 %res.2, %c.3228 229  %c.4 = icmp eq i8 %a, 0230  %res.4 = xor i1 %res.3, %c.4231 232  %c.5 = icmp ugt i8 %a, 0233  %res.5 = xor i1 %res.4, %c.5234 235  %c.6 = icmp uge i8 %a, 1236  %res.6 = xor i1 %res.5, %c.6237 238  %c.7 = icmp ugt i8 %a, 1239  %res.7 = xor i1 %res.6, %c.5240 241  %c.8 = icmp sgt i8 %a, 0242  %res.8 = xor i1 %res.7, %c.6243 244  ret i1 %res.8245 246else:247  %t.2 = icmp ne i8 %a, 0248  %c.9 = icmp ne i8 %a, 1249  %res.9 = xor i1 %t.2, %c.9250 251  %c.10 = icmp ne i8 %a, %b252  %res.10 = xor i1 %res.9, %c.10253 254  %c.11 = icmp eq i8 %a, %b255  %res.11 = xor i1 %res.10, %c.11256 257  %f.1 = icmp eq i8 %a, 0258  %res.12 = xor i1 %res.11, %f.1259 260  %t.3 = icmp ugt i8 %a, 0261  %res.13 = xor i1 %res.12, %t.3262 263  %t.4 = icmp uge i8 %a, 1264  %res.14 = xor i1 %res.13, %t.4265 266  %f.2 = icmp ugt i8 %a, 1267  %res.15 = xor i1 %res.14, %f.2268 269  %c.12 = icmp sgt i8 %a, 0270  %res.16 = xor i1 %res.15, %c.12271 272  ret i1 %res.16273}274 275define i1 @assume_b_plus_1_ult_a(i64 %a, i64 %b) {276; CHECK-LABEL: @assume_b_plus_1_ult_a(277; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i64 [[B:%.*]], 1278; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], [[A:%.*]]279; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])280; CHECK-NEXT:    ret i1 true281;282  %1 = add nuw i64 %b, 1283  %2 = icmp ult i64 %1, %a284  tail call void @llvm.assume(i1 %2)285  %3 = icmp ne i64 %a, %b286  ret i1 %3287}288 289define i1 @assume_a_gt_b_and_b_ge_c(i64 %a, i64 %b, i64 %c) {290; CHECK-LABEL: @assume_a_gt_b_and_b_ge_c(291; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i64 [[A:%.*]], [[B:%.*]]292; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP1]])293; CHECK-NEXT:    [[TMP2:%.*]] = icmp uge i64 [[B]], [[C:%.*]]294; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])295; CHECK-NEXT:    ret i1 true296;297  %1 = icmp ugt i64 %a, %b298  tail call void @llvm.assume(i1 %1)299  %2 = icmp uge i64 %b, %c300  tail call void @llvm.assume(i1 %2)301  %3 = icmp ne i64 %a, %c302  ret i1 %3303}304 305define i1 @assume_a_ne_b_and_b_ne_c(i64 %a, i64 %b, i64 %c) {306; CHECK-LABEL: @assume_a_ne_b_and_b_ne_c(307; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]308; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP1]])309; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i64 [[B]], [[C:%.*]]310; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])311; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i64 [[A]], [[C]]312; CHECK-NEXT:    ret i1 [[TMP3]]313;314  %1 = icmp ne i64 %a, %b315  tail call void @llvm.assume(i1 %1)316  %2 = icmp ne i64 %b, %c317  tail call void @llvm.assume(i1 %2)318  %3 = icmp ne i64 %a, %c319  ret i1 %3320}321 322define i1 @assume_1a(i64 %a, i64 %b) {323; CHECK-LABEL: @assume_1a(324; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]325; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])326; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i64 [[A]], [[B]]327; CHECK-NEXT:    ret i1 [[RET]]328;329  %ne = icmp ne i64 %a, %b330  tail call void @llvm.assume(i1 %ne)331  %ret = icmp ugt i64 %a, %b332  ret i1 %ret333}334 335define i1 @assume_1b(i64 %a, i64 %b) {336; CHECK-LABEL: @assume_1b(337; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]338; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])339; CHECK-NEXT:    [[RET:%.*]] = icmp uge i64 [[A]], [[B]]340; CHECK-NEXT:    ret i1 [[RET]]341;342  %ne = icmp ne i64 %a, %b343  tail call void @llvm.assume(i1 %ne)344  %ret = icmp uge i64 %a, %b345  ret i1 %ret346}347 348define i1 @assume_2a(i64 %a, i64 %b) {349; CHECK-LABEL: @assume_2a(350; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]351; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])352; CHECK-NEXT:    [[RET:%.*]] = icmp ult i64 [[A]], [[B]]353; CHECK-NEXT:    ret i1 [[RET]]354;355  %ne = icmp ne i64 %a, %b356  tail call void @llvm.assume(i1 %ne)357  %ret = icmp ult i64 %a, %b358  ret i1 %ret359}360 361define i1 @assume_2b(i64 %a, i64 %b) {362; CHECK-LABEL: @assume_2b(363; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]364; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])365; CHECK-NEXT:    [[RET:%.*]] = icmp ule i64 [[A]], [[B]]366; CHECK-NEXT:    ret i1 [[RET]]367;368  %ne = icmp ne i64 %a, %b369  tail call void @llvm.assume(i1 %ne)370  %ret = icmp ule i64 %a, %b371  ret i1 %ret372}373 374; TODO: extend to support signed comparisons375define i1 @assume_3a(i64 %a, i64 %b) {376; CHECK-LABEL: @assume_3a(377; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]378; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])379; CHECK-NEXT:    [[RET:%.*]] = icmp sgt i64 [[A]], [[B]]380; CHECK-NEXT:    ret i1 [[RET]]381;382  %ne = icmp ne i64 %a, %b383  tail call void @llvm.assume(i1 %ne)384  %ret = icmp sgt i64 %a, %b385  ret i1 %ret386}387 388define i1 @assume_3b(i64 %a, i64 %b) {389; CHECK-LABEL: @assume_3b(390; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]391; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])392; CHECK-NEXT:    [[RET:%.*]] = icmp sge i64 [[A]], [[B]]393; CHECK-NEXT:    ret i1 [[RET]]394;395  %ne = icmp ne i64 %a, %b396  tail call void @llvm.assume(i1 %ne)397  %ret = icmp sge i64 %a, %b398  ret i1 %ret399}400 401define i1 @assume_4a(i64 %a, i64 %b) {402; CHECK-LABEL: @assume_4a(403; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]404; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])405; CHECK-NEXT:    [[RET:%.*]] = icmp slt i64 [[A]], [[B]]406; CHECK-NEXT:    ret i1 [[RET]]407;408  %ne = icmp ne i64 %a, %b409  tail call void @llvm.assume(i1 %ne)410  %ret = icmp slt i64 %a, %b411  ret i1 %ret412}413 414define i1 @assume_4b(i64 %a, i64 %b) {415; CHECK-LABEL: @assume_4b(416; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]417; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])418; CHECK-NEXT:    [[RET:%.*]] = icmp sle i64 [[A]], [[B]]419; CHECK-NEXT:    ret i1 [[RET]]420;421  %ne = icmp ne i64 %a, %b422  tail call void @llvm.assume(i1 %ne)423  %ret = icmp sle i64 %a, %b424  ret i1 %ret425}426