brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.7 KiB · 84d9e3c Raw
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