337 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' < %s | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"5target triple = "thumbv8.1m.main-none-eabi"6 7define i32 @lshr3_then(i32 %a) {8; CHECK-LABEL: @lshr3_then(9; CHECK-NEXT: entry:10; CHECK-NEXT: [[L:%.*]] = lshr i32 [[A:%.*]], 311; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[L]], 012; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]13; CHECK: then:14; CHECK-NEXT: ret i32 015; CHECK: else:16; CHECK-NEXT: ret i32 [[L]]17;18entry:19 %c = icmp ult i32 %a, 820 br i1 %c, label %then, label %else21 22then:23 ret i32 024 25else:26 %l = lshr i32 %a, 327 ret i32 %l28}29 30define i32 @lshr5_else(i32 %a) {31; CHECK-LABEL: @lshr5_else(32; CHECK-NEXT: entry:33; CHECK-NEXT: [[L:%.*]] = lshr i32 [[A:%.*]], 534; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[L]], 035; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]36; CHECK: then:37; CHECK-NEXT: ret i32 [[L]]38; CHECK: else:39; CHECK-NEXT: ret i32 040;41entry:42 %c = icmp ult i32 %a, 3243 br i1 %c, label %then, label %else44 45then:46 %l = lshr i32 %a, 547 ret i32 %l48 49else:50 ret i32 051}52 53define i32 @lshr2_entry(i32 %a) {54; CHECK-LABEL: @lshr2_entry(55; CHECK-NEXT: entry:56; CHECK-NEXT: [[L:%.*]] = lshr i32 [[A:%.*]], 157; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[L]], 058; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]59; CHECK: then:60; CHECK-NEXT: ret i32 [[L]]61; CHECK: else:62; CHECK-NEXT: ret i32 063;64entry:65 %l = lshr i32 %a, 166 %c = icmp ult i32 %a, 267 br i1 %c, label %then, label %else68 69then:70 ret i32 %l71 72else:73 ret i32 074}75 76define i32 @lshr5mismatch(i32 %a) {77; CHECK-LABEL: @lshr5mismatch(78; CHECK-NEXT: entry:79; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[A:%.*]], 1780; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]81; CHECK: then:82; CHECK-NEXT: [[L:%.*]] = lshr i32 [[A]], 583; CHECK-NEXT: ret i32 [[L]]84; CHECK: else:85; CHECK-NEXT: ret i32 086;87entry:88 %c = icmp ult i32 %a, 1789 br i1 %c, label %then, label %else90 91then:92 %l = lshr i32 %a, 593 ret i32 %l94 95else:96 ret i32 097}98 99define i32 @ashr5_else(i32 %a) {100; CHECK-LABEL: @ashr5_else(101; CHECK-NEXT: entry:102; CHECK-NEXT: [[L:%.*]] = ashr i32 [[A:%.*]], 5103; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[L]], 0104; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]105; CHECK: then:106; CHECK-NEXT: ret i32 [[L]]107; CHECK: else:108; CHECK-NEXT: ret i32 0109;110entry:111 %c = icmp ult i32 %a, 32112 br i1 %c, label %then, label %else113 114then:115 %l = ashr i32 %a, 5116 ret i32 %l117 118else:119 ret i32 0120}121 122define i32 @add10_else(i32 %a) {123; CHECK-LABEL: @add10_else(124; CHECK-NEXT: entry:125; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[A:%.*]], 10126; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]127; CHECK: then:128; CHECK-NEXT: ret i32 0129; CHECK: else:130; CHECK-NEXT: [[L:%.*]] = add i32 [[A]], 10131; CHECK-NEXT: ret i32 [[L]]132;133entry:134 %c = icmp eq i32 %a, 10135 br i1 %c, label %then, label %else136 137then:138 ret i32 0139 140else:141 %l = add i32 %a, 10142 ret i32 %l143}144 145define i32 @addm10_then(i32 %a) {146; CHECK-LABEL: @addm10_then(147; CHECK-NEXT: entry:148; CHECK-NEXT: [[L:%.*]] = add i32 [[A:%.*]], -10149; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[L]], 0150; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]151; CHECK: then:152; CHECK-NEXT: ret i32 [[L]]153; CHECK: else:154; CHECK-NEXT: ret i32 0155;156entry:157 %c = icmp eq i32 %a, 10158 br i1 %c, label %then, label %else159 160then:161 %l = add i32 %a, -10162 ret i32 %l163 164else:165 ret i32 0166}167 168define i32 @add_missmatch(i32 %a) {169; CHECK-LABEL: @add_missmatch(170; CHECK-NEXT: entry:171; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[A:%.*]], 10172; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]173; CHECK: then:174; CHECK-NEXT: [[L:%.*]] = add i32 [[A]], 10175; CHECK-NEXT: ret i32 [[L]]176; CHECK: else:177; CHECK-NEXT: ret i32 0178;179entry:180 %c = icmp eq i32 %a, 10181 br i1 %c, label %then, label %else182 183then:184 %l = add i32 %a, 10185 ret i32 %l186 187else:188 ret i32 0189}190 191define i32 @sub10_else(i32 %a) {192; CHECK-LABEL: @sub10_else(193; CHECK-NEXT: entry:194; CHECK-NEXT: [[L:%.*]] = sub i32 [[A:%.*]], 10195; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[L]], 0196; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]197; CHECK: then:198; CHECK-NEXT: ret i32 0199; CHECK: else:200; CHECK-NEXT: ret i32 [[L]]201;202entry:203 %c = icmp eq i32 %a, 10204 br i1 %c, label %then, label %else205 206then:207 ret i32 0208 209else:210 %l = sub i32 %a, 10211 ret i32 %l212}213 214define i32 @sub10_else_drop_nuw(i32 %a) {215; CHECK-LABEL: @sub10_else_drop_nuw(216; CHECK-NEXT: entry:217; CHECK-NEXT: [[L:%.*]] = sub i32 [[A:%.*]], 10218; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[L]], 0219; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]220; CHECK: then:221; CHECK-NEXT: ret i32 0222; CHECK: else:223; CHECK-NEXT: ret i32 [[L]]224;225entry:226 %c = icmp eq i32 %a, 10227 br i1 %c, label %then, label %else228 229then:230 ret i32 0231 232else:233 %l = sub nuw i32 %a, 10234 ret i32 %l235}236 237define i32 @subm10_then(i32 %a) {238; CHECK-LABEL: @subm10_then(239; CHECK-NEXT: entry:240; CHECK-NEXT: [[L:%.*]] = sub i32 [[A:%.*]], -10241; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[L]], 0242; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]243; CHECK: then:244; CHECK-NEXT: ret i32 [[L]]245; CHECK: else:246; CHECK-NEXT: ret i32 0247;248entry:249 %c = icmp eq i32 %a, -10250 br i1 %c, label %then, label %else251 252then:253 %l = sub i32 %a, -10254 ret i32 %l255 256else:257 ret i32 0258}259 260define i64 @lshr64(i64 %a) {261; CHECK-LABEL: @lshr64(262; CHECK-NEXT: entry:263; CHECK-NEXT: [[L:%.*]] = lshr i64 [[A:%.*]], 40264; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i64 [[L]], 0265; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]266; CHECK: then:267; CHECK-NEXT: ret i64 0268; CHECK: else:269; CHECK-NEXT: ret i64 [[L]]270;271entry:272 %c = icmp ult i64 %a, 1099511627776273 br i1 %c, label %then, label %else274 275then:276 ret i64 0277 278else:279 %l = lshr i64 %a, 40280 ret i64 %l281}282 283define i128 @lshr128(i128 %a) {284; CHECK-LABEL: @lshr128(285; CHECK-NEXT: entry:286; CHECK-NEXT: [[L:%.*]] = lshr i128 [[A:%.*]], 65287; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i128 [[L]], 0288; CHECK-NEXT: br i1 [[TMP0]], label [[THEN:%.*]], label [[ELSE:%.*]]289; CHECK: then:290; CHECK-NEXT: ret i128 0291; CHECK: else:292; CHECK-NEXT: ret i128 [[L]]293;294entry:295 %c = icmp ult i128 %a, 36893488147419103232296 br i1 %c, label %then, label %else297 298then:299 ret i128 0300 301else:302 %l = lshr i128 %a, 65303 ret i128 %l304}305 306define i32 @addm1_dom(i32 %a) {307; CHECK-LABEL: @addm1_dom(308; CHECK-NEXT: entry:309; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[A:%.*]], 100310; CHECK-NEXT: br i1 [[C1]], label [[IF:%.*]], label [[ELSE:%.*]]311; CHECK: if:312; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[A]], -1313; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE]]314; CHECK: then:315; CHECK-NEXT: ret i32 0316; CHECK: else:317; CHECK-NEXT: [[L:%.*]] = add i32 [[A]], 1318; CHECK-NEXT: ret i32 [[L]]319;320entry:321 %c1 = icmp eq i32 %a, 100322 br i1 %c1, label %if, label %else323 324if:325 %c = icmp eq i32 %a, -1326 br i1 %c, label %then, label %else327 328then:329 ret i32 0330 331else:332 %l = add i32 %a, 1333 ret i32 %l334}335 336declare void @other()337