682 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"5 6declare void @foo(i32 %x)7 8define i32 @compare_against_arbitrary_value(i32 %x, i32 %c) {9; CHECK-LABEL: @compare_against_arbitrary_value(10; CHECK-NEXT: entry:11; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], [[C:%.*]]12; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]13; CHECK: callfoo:14; CHECK-NEXT: call void @foo(i32 1)15; CHECK-NEXT: br label [[EXIT]]16; CHECK: exit:17; CHECK-NEXT: ret i32 4218;19 20entry:21 %cmp1 = icmp eq i32 %x, %c22 %cmp2 = icmp slt i32 %x, %c23 %select1 = select i1 %cmp2, i32 -1, i32 124 %select2 = select i1 %cmp1, i32 0, i32 %select125 %cond = icmp sgt i32 %select2, 026 br i1 %cond, label %callfoo, label %exit27 28callfoo:29 call void @foo(i32 %select2)30 br label %exit31 32exit:33 ret i32 4234}35 36define i32 @compare_against_zero(i32 %x) {37; CHECK-LABEL: @compare_against_zero(38; CHECK-NEXT: entry:39; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 040; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]41; CHECK: callfoo:42; CHECK-NEXT: call void @foo(i32 1)43; CHECK-NEXT: br label [[EXIT]]44; CHECK: exit:45; CHECK-NEXT: ret i32 4246;47 48entry:49 %cmp1 = icmp eq i32 %x, 050 %cmp2 = icmp slt i32 %x, 051 %select1 = select i1 %cmp2, i32 -1, i32 152 %select2 = select i1 %cmp1, i32 0, i32 %select153 %cond = icmp sgt i32 %select2, 054 br i1 %cond, label %callfoo, label %exit55 56callfoo:57 call void @foo(i32 %select2)58 br label %exit59 60exit:61 ret i32 4262}63 64define i32 @compare_against_one(i32 %x) {65; CHECK-LABEL: @compare_against_one(66; CHECK-NEXT: entry:67; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 168; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]69; CHECK: callfoo:70; CHECK-NEXT: call void @foo(i32 1)71; CHECK-NEXT: br label [[EXIT]]72; CHECK: exit:73; CHECK-NEXT: ret i32 4274;75 76entry:77 %cmp1 = icmp eq i32 %x, 178 %cmp2 = icmp slt i32 %x, 179 %select1 = select i1 %cmp2, i32 -1, i32 180 %select2 = select i1 %cmp1, i32 0, i32 %select181 %cond = icmp sgt i32 %select2, 082 br i1 %cond, label %callfoo, label %exit83 84callfoo:85 call void @foo(i32 %select2)86 br label %exit87 88exit:89 ret i32 4290}91 92define i32 @compare_against_two(i32 %x) {93; CHECK-LABEL: @compare_against_two(94; CHECK-NEXT: entry:95; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 296; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]97; CHECK: callfoo:98; CHECK-NEXT: call void @foo(i32 1)99; CHECK-NEXT: br label [[EXIT]]100; CHECK: exit:101; CHECK-NEXT: ret i32 42102;103 104entry:105 %cmp1 = icmp eq i32 %x, 2106 %cmp2 = icmp slt i32 %x, 2107 %select1 = select i1 %cmp2, i32 -1, i32 1108 %select2 = select i1 %cmp1, i32 0, i32 %select1109 %cond = icmp sgt i32 %select2, 0110 br i1 %cond, label %callfoo, label %exit111 112callfoo:113 call void @foo(i32 %select2)114 br label %exit115 116exit:117 ret i32 42118}119 120define i32 @compare_against_three(i32 %x) {121; CHECK-LABEL: @compare_against_three(122; CHECK-NEXT: entry:123; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 3124; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]125; CHECK: callfoo:126; CHECK-NEXT: call void @foo(i32 1)127; CHECK-NEXT: br label [[EXIT]]128; CHECK: exit:129; CHECK-NEXT: ret i32 42130;131 132entry:133 %cmp1 = icmp eq i32 %x, 3134 %cmp2 = icmp slt i32 %x, 3135 %select1 = select i1 %cmp2, i32 -1, i32 1136 %select2 = select i1 %cmp1, i32 0, i32 %select1137 %cond = icmp sgt i32 %select2, 0138 br i1 %cond, label %callfoo, label %exit139 140callfoo:141 call void @foo(i32 %select2)142 br label %exit143 144exit:145 ret i32 42146}147 148define i32 @compare_against_four(i32 %x) {149; CHECK-LABEL: @compare_against_four(150; CHECK-NEXT: entry:151; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 4152; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]153; CHECK: callfoo:154; CHECK-NEXT: call void @foo(i32 1)155; CHECK-NEXT: br label [[EXIT]]156; CHECK: exit:157; CHECK-NEXT: ret i32 42158;159 160entry:161 %cmp1 = icmp eq i32 %x, 4162 %cmp2 = icmp slt i32 %x, 4163 %select1 = select i1 %cmp2, i32 -1, i32 1164 %select2 = select i1 %cmp1, i32 0, i32 %select1165 %cond = icmp sgt i32 %select2, 0166 br i1 %cond, label %callfoo, label %exit167 168callfoo:169 call void @foo(i32 %select2)170 br label %exit171 172exit:173 ret i32 42174}175 176define i32 @compare_against_five(i32 %x) {177; CHECK-LABEL: @compare_against_five(178; CHECK-NEXT: entry:179; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 5180; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]181; CHECK: callfoo:182; CHECK-NEXT: call void @foo(i32 1)183; CHECK-NEXT: br label [[EXIT]]184; CHECK: exit:185; CHECK-NEXT: ret i32 42186;187 188entry:189 %cmp1 = icmp eq i32 %x, 5190 %cmp2 = icmp slt i32 %x, 5191 %select1 = select i1 %cmp2, i32 -1, i32 1192 %select2 = select i1 %cmp1, i32 0, i32 %select1193 %cond = icmp sgt i32 %select2, 0194 br i1 %cond, label %callfoo, label %exit195 196callfoo:197 call void @foo(i32 %select2)198 br label %exit199 200exit:201 ret i32 42202}203 204define i32 @compare_against_six(i32 %x) {205; CHECK-LABEL: @compare_against_six(206; CHECK-NEXT: entry:207; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 6208; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]209; CHECK: callfoo:210; CHECK-NEXT: call void @foo(i32 1)211; CHECK-NEXT: br label [[EXIT]]212; CHECK: exit:213; CHECK-NEXT: ret i32 42214;215 216entry:217 %cmp1 = icmp eq i32 %x, 6218 %cmp2 = icmp slt i32 %x, 6219 %select1 = select i1 %cmp2, i32 -1, i32 1220 %select2 = select i1 %cmp1, i32 0, i32 %select1221 %cond = icmp sgt i32 %select2, 0222 br i1 %cond, label %callfoo, label %exit223 224callfoo:225 call void @foo(i32 %select2)226 br label %exit227 228exit:229 ret i32 42230}231 232; Same as @compare_against_arbitrary_value, but now the three-way comparison233; returns not idiomatic comparator's result (-1, 0, 1) but some other constants.234define i32 @compare_against_arbitrary_value_non_idiomatic_1(i32 %x, i32 %c) {235; CHECK-LABEL: @compare_against_arbitrary_value_non_idiomatic_1(236; CHECK-NEXT: entry:237; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], [[C:%.*]]238; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]239; CHECK: callfoo:240; CHECK-NEXT: call void @foo(i32 425)241; CHECK-NEXT: br label [[EXIT]]242; CHECK: exit:243; CHECK-NEXT: ret i32 42244;245 246entry:247 %cmp1 = icmp eq i32 %x, %c248 %cmp2 = icmp slt i32 %x, %c249 %select1 = select i1 %cmp2, i32 -6, i32 425250 %select2 = select i1 %cmp1, i32 0, i32 %select1251 %cond = icmp sgt i32 %select2, 0252 br i1 %cond, label %callfoo, label %exit253 254callfoo:255 call void @foo(i32 %select2)256 br label %exit257 258exit:259 ret i32 42260}261 262define i32 @compare_against_zero_non_idiomatic_add(i32 %x) {263; CHECK-LABEL: @compare_against_zero_non_idiomatic_add(264; CHECK-NEXT: entry:265; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 0266; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]267; CHECK: callfoo:268; CHECK-NEXT: call void @foo(i32 425)269; CHECK-NEXT: br label [[EXIT]]270; CHECK: exit:271; CHECK-NEXT: ret i32 42272;273 274entry:275 %cmp1 = icmp eq i32 %x, 0276 %cmp2 = icmp slt i32 %x, 0277 %select1 = select i1 %cmp2, i32 -6, i32 425278 %select2 = select i1 %cmp1, i32 0, i32 %select1279 %cond = icmp sgt i32 %select2, 0280 br i1 %cond, label %callfoo, label %exit281 282callfoo:283 call void @foo(i32 %select2)284 br label %exit285 286exit:287 ret i32 42288}289 290; Same as @compare_against_arbitrary_value, but now the three-way comparison291; returns not idiomatic comparator's result (-1, 0, 1) but some other constants.292define i32 @compare_against_arbitrary_value_non_idiomatic_2(i32 %x, i32 %c) {293; CHECK-LABEL: @compare_against_arbitrary_value_non_idiomatic_2(294; CHECK-NEXT: entry:295; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], [[C:%.*]]296; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]297; CHECK: callfoo:298; CHECK-NEXT: call void @foo(i32 425)299; CHECK-NEXT: br label [[EXIT]]300; CHECK: exit:301; CHECK-NEXT: ret i32 42302;303 304entry:305 %cmp1 = icmp eq i32 %x, %c306 %cmp2 = icmp slt i32 %x, %c307 %select1 = select i1 %cmp2, i32 -5, i32 425308 %select2 = select i1 %cmp1, i32 0, i32 %select1309 %cond = icmp sgt i32 %select2, 0310 br i1 %cond, label %callfoo, label %exit311 312callfoo:313 call void @foo(i32 %select2)314 br label %exit315 316exit:317 ret i32 42318}319 320define i32 @compare_against_zero_non_idiomatic_or(i32 %x) {321; CHECK-LABEL: @compare_against_zero_non_idiomatic_or(322; CHECK-NEXT: entry:323; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 0324; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]325; CHECK: callfoo:326; CHECK-NEXT: call void @foo(i32 425)327; CHECK-NEXT: br label [[EXIT]]328; CHECK: exit:329; CHECK-NEXT: ret i32 42330;331 332entry:333 %cmp1 = icmp eq i32 %x, 0334 %cmp2 = icmp slt i32 %x, 0335 %select1 = select i1 %cmp2, i32 -5, i32 425336 %select2 = select i1 %cmp1, i32 0, i32 %select1337 %cond = icmp sgt i32 %select2, 0338 br i1 %cond, label %callfoo, label %exit339 340callfoo:341 call void @foo(i32 %select2)342 br label %exit343 344exit:345 ret i32 42346}347 348define i32 @compare_against_arbitrary_value_type_mismatch(i64 %x, i64 %c) {349; CHECK-LABEL: @compare_against_arbitrary_value_type_mismatch(350; CHECK-NEXT: entry:351; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i64 [[X:%.*]], [[C:%.*]]352; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]353; CHECK: callfoo:354; CHECK-NEXT: call void @foo(i32 1)355; CHECK-NEXT: br label [[EXIT]]356; CHECK: exit:357; CHECK-NEXT: ret i32 42358;359 360entry:361 %cmp1 = icmp eq i64 %x, %c362 %cmp2 = icmp slt i64 %x, %c363 %select1 = select i1 %cmp2, i32 -1, i32 1364 %select2 = select i1 %cmp1, i32 0, i32 %select1365 %cond = icmp sgt i32 %select2, 0366 br i1 %cond, label %callfoo, label %exit367 368callfoo:369 call void @foo(i32 %select2)370 br label %exit371 372exit:373 ret i32 42374}375 376define i32 @compare_against_zero_type_mismatch_idiomatic(i64 %x) {377; CHECK-LABEL: @compare_against_zero_type_mismatch_idiomatic(378; CHECK-NEXT: entry:379; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i64 [[X:%.*]], 0380; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]381; CHECK: callfoo:382; CHECK-NEXT: call void @foo(i32 1)383; CHECK-NEXT: br label [[EXIT]]384; CHECK: exit:385; CHECK-NEXT: ret i32 42386;387 388entry:389 %cmp1 = icmp eq i64 %x, 0390 %cmp2 = icmp slt i64 %x, 0391 %select1 = select i1 %cmp2, i32 -1, i32 1392 %select2 = select i1 %cmp1, i32 0, i32 %select1393 %cond = icmp sgt i32 %select2, 0394 br i1 %cond, label %callfoo, label %exit395 396callfoo:397 call void @foo(i32 %select2)398 br label %exit399 400exit:401 ret i32 42402}403 404define i32 @compare_against_zero_type_mismatch_non_idiomatic_1(i64 %x) {405; CHECK-LABEL: @compare_against_zero_type_mismatch_non_idiomatic_1(406; CHECK-NEXT: entry:407; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i64 [[X:%.*]], 0408; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]409; CHECK: callfoo:410; CHECK-NEXT: call void @foo(i32 1)411; CHECK-NEXT: br label [[EXIT]]412; CHECK: exit:413; CHECK-NEXT: ret i32 42414;415 416entry:417 %cmp1 = icmp eq i64 %x, 0418 %cmp2 = icmp slt i64 %x, 0419 %select1 = select i1 %cmp2, i32 -7, i32 1420 %select2 = select i1 %cmp1, i32 0, i32 %select1421 %cond = icmp sgt i32 %select2, 0422 br i1 %cond, label %callfoo, label %exit423 424callfoo:425 call void @foo(i32 %select2)426 br label %exit427 428exit:429 ret i32 42430}431 432define i32 @compare_against_zero_type_mismatch_non_idiomatic_2(i64 %x) {433; CHECK-LABEL: @compare_against_zero_type_mismatch_non_idiomatic_2(434; CHECK-NEXT: entry:435; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i64 [[X:%.*]], 0436; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]437; CHECK: callfoo:438; CHECK-NEXT: call void @foo(i32 1)439; CHECK-NEXT: br label [[EXIT]]440; CHECK: exit:441; CHECK-NEXT: ret i32 42442;443 444entry:445 %cmp1 = icmp eq i64 %x, 0446 %cmp2 = icmp slt i64 %x, 0447 %select1 = select i1 %cmp2, i32 -6, i32 1448 %select2 = select i1 %cmp1, i32 0, i32 %select1449 %cond = icmp sgt i32 %select2, 0450 br i1 %cond, label %callfoo, label %exit451 452callfoo:453 call void @foo(i32 %select2)454 br label %exit455 456exit:457 ret i32 42458}459 460declare void @use1(i1)461define i32 @compare_against_fortytwo_commutatibility_0(i32 %x) {462; CHECK-LABEL: @compare_against_fortytwo_commutatibility_0(463; CHECK-NEXT: entry:464; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 42465; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]466; CHECK: callfoo:467; CHECK-NEXT: call void @foo(i32 1)468; CHECK-NEXT: br label [[EXIT]]469; CHECK: exit:470; CHECK-NEXT: ret i32 84471;472entry:473 %cmp1 = icmp eq i32 %x, 42474 %cmp2 = icmp slt i32 %x, 42475 %select1 = select i1 %cmp2, i32 -1, i32 1476 %select2 = select i1 %cmp1, i32 0, i32 %select1477 %cond = icmp sgt i32 %select2, 0478 br i1 %cond, label %callfoo, label %exit479 480callfoo:481 call void @foo(i32 %select2)482 br label %exit483 484exit:485 ret i32 84486}487define i32 @compare_against_fortytwo_commutatibility_1(i32 %x) {488; CHECK-LABEL: @compare_against_fortytwo_commutatibility_1(489; CHECK-NEXT: entry:490; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], 42491; CHECK-NEXT: call void @use1(i1 [[CMP1]])492; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X]], 42493; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]494; CHECK: callfoo:495; CHECK-NEXT: call void @foo(i32 1)496; CHECK-NEXT: br label [[EXIT]]497; CHECK: exit:498; CHECK-NEXT: ret i32 84499;500entry:501 %cmp1 = icmp ne i32 %x, 42 ; inverted502 call void @use1(i1 %cmp1)503 %cmp2 = icmp slt i32 %x, 42504 %select1 = select i1 %cmp2, i32 -1, i32 1505 %select2 = select i1 %cmp1, i32 %select1, i32 0 ; swapped506 %cond = icmp sgt i32 %select2, 0507 br i1 %cond, label %callfoo, label %exit508 509callfoo:510 call void @foo(i32 %select2)511 br label %exit512 513exit:514 ret i32 84515}516define i32 @compare_against_fortytwo_commutatibility_2(i32 %x) {517; CHECK-LABEL: @compare_against_fortytwo_commutatibility_2(518; CHECK-NEXT: entry:519; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], 42520; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]521; CHECK: callfoo:522; CHECK-NEXT: call void @foo(i32 1)523; CHECK-NEXT: br label [[EXIT]]524; CHECK: exit:525; CHECK-NEXT: ret i32 84526;527entry:528 %cmp1 = icmp eq i32 %x, 42529 %cmp2 = icmp sgt i32 %x, 41 ; inverted530 %select1 = select i1 %cmp2, i32 1, i32 -1 ; swapped531 %select2 = select i1 %cmp1, i32 0, i32 %select1532 %cond = icmp sgt i32 %select2, 0533 br i1 %cond, label %callfoo, label %exit534 535callfoo:536 call void @foo(i32 %select2)537 br label %exit538 539exit:540 ret i32 84541}542define i32 @compare_against_fortytwo_commutatibility_3(i32 %x) {543; CHECK-LABEL: @compare_against_fortytwo_commutatibility_3(544; CHECK-NEXT: entry:545; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], 42546; CHECK-NEXT: call void @use1(i1 [[CMP1]])547; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X]], 42548; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]549; CHECK: callfoo:550; CHECK-NEXT: call void @foo(i32 1)551; CHECK-NEXT: br label [[EXIT]]552; CHECK: exit:553; CHECK-NEXT: ret i32 84554;555entry:556 %cmp1 = icmp ne i32 %x, 42 ; inverted557 call void @use1(i1 %cmp1)558 %cmp2 = icmp sgt i32 %x, 41 ; inverted559 %select1 = select i1 %cmp2, i32 1, i32 -1 ; swapped560 %select2 = select i1 %cmp1, i32 %select1, i32 0 ; swapped561 %cond = icmp sgt i32 %select2, 0562 br i1 %cond, label %callfoo, label %exit563 564callfoo:565 call void @foo(i32 %select2)566 br label %exit567 568exit:569 ret i32 84570}571 572define i32 @compare_against_arbitrary_value_commutativity0(i32 %x, i32 %c) {573; CHECK-LABEL: @compare_against_arbitrary_value_commutativity0(574; CHECK-NEXT: entry:575; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], [[C:%.*]]576; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]577; CHECK: callfoo:578; CHECK-NEXT: call void @foo(i32 1)579; CHECK-NEXT: br label [[EXIT]]580; CHECK: exit:581; CHECK-NEXT: ret i32 42582;583entry:584 %cmp1 = icmp eq i32 %x, %c585 %cmp2 = icmp slt i32 %x, %c586 %select1 = select i1 %cmp2, i32 -1, i32 1587 %select2 = select i1 %cmp1, i32 0, i32 %select1588 %cond = icmp sgt i32 %select2, 0589 br i1 %cond, label %callfoo, label %exit590 591callfoo:592 call void @foo(i32 %select2)593 br label %exit594 595exit:596 ret i32 42597}598define i32 @compare_against_arbitrary_value_commutativity1(i32 %x, i32 %c) {599; CHECK-LABEL: @compare_against_arbitrary_value_commutativity1(600; CHECK-NEXT: entry:601; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X:%.*]], [[C:%.*]]602; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]603; CHECK: callfoo:604; CHECK-NEXT: call void @foo(i32 1)605; CHECK-NEXT: br label [[EXIT]]606; CHECK: exit:607; CHECK-NEXT: ret i32 42608;609entry:610 %cmp1 = icmp eq i32 %x, %c611 %cmp2 = icmp sgt i32 %c, %x ; swapped612 %select1 = select i1 %cmp2, i32 -1, i32 1613 %select2 = select i1 %cmp1, i32 0, i32 %select1614 %cond = icmp sgt i32 %select2, 0615 br i1 %cond, label %callfoo, label %exit616 617callfoo:618 call void @foo(i32 %select2)619 br label %exit620 621exit:622 ret i32 42623}624define i32 @compare_against_arbitrary_value_commutativity2(i32 %x, i32 %c) {625; CHECK-LABEL: @compare_against_arbitrary_value_commutativity2(626; CHECK-NEXT: entry:627; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], [[C:%.*]]628; CHECK-NEXT: call void @use1(i1 [[CMP1]])629; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X]], [[C]]630; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]631; CHECK: callfoo:632; CHECK-NEXT: call void @foo(i32 1)633; CHECK-NEXT: br label [[EXIT]]634; CHECK: exit:635; CHECK-NEXT: ret i32 42636;637entry:638 %cmp1 = icmp ne i32 %x, %c ; inverted639 call void @use1(i1 %cmp1)640 %cmp2 = icmp slt i32 %x, %c641 %select1 = select i1 %cmp2, i32 -1, i32 1642 %select2 = select i1 %cmp1, i32 %select1, i32 0 ; swapped643 %cond = icmp sgt i32 %select2, 0644 br i1 %cond, label %callfoo, label %exit645 646callfoo:647 call void @foo(i32 %select2)648 br label %exit649 650exit:651 ret i32 42652}653define i32 @compare_against_arbitrary_value_commutativity3(i32 %x, i32 %c) {654; CHECK-LABEL: @compare_against_arbitrary_value_commutativity3(655; CHECK-NEXT: entry:656; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[X:%.*]], [[C:%.*]]657; CHECK-NEXT: call void @use1(i1 [[CMP1]])658; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[X]], [[C]]659; CHECK-NEXT: br i1 [[TMP0]], label [[CALLFOO:%.*]], label [[EXIT:%.*]]660; CHECK: callfoo:661; CHECK-NEXT: call void @foo(i32 1)662; CHECK-NEXT: br label [[EXIT]]663; CHECK: exit:664; CHECK-NEXT: ret i32 42665;666entry:667 %cmp1 = icmp ne i32 %x, %c ; inverted668 call void @use1(i1 %cmp1)669 %cmp2 = icmp sgt i32 %c, %x ; swapped670 %select1 = select i1 %cmp2, i32 -1, i32 1671 %select2 = select i1 %cmp1, i32 %select1, i32 0 ; swapped672 %cond = icmp sgt i32 %select2, 0673 br i1 %cond, label %callfoo, label %exit674 675callfoo:676 call void @foo(i32 %select2)677 br label %exit678 679exit:680 ret i32 42681}682