brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · 73fb93f Raw
160 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @test(i1 %cond, i64 %left, i64 %right) {5; CHECK-LABEL: define i1 @test(6; CHECK-SAME: i1 [[COND:%.*]], i64 [[LEFT:%.*]], i64 [[RIGHT:%.*]]) {7; CHECK-NEXT:  [[START:.*:]]8; CHECK-NEXT:    br i1 [[COND]], label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]9; CHECK:       [[COND_TRUE]]:10; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i64 [[RIGHT]], [[LEFT]]11; CHECK-NEXT:    br i1 [[CMP]], label %[[END:.*]], label %[[COND_FALSE]]12; CHECK:       [[COND_FALSE]]:13; CHECK-NEXT:    br label %[[END]]14; CHECK:       [[END]]:15; CHECK-NEXT:    ret i1 false16;17start:18  br i1 %cond, label %cond.true, label %cond.false19 20cond.true:21  %cmp = icmp sgt i64 %right, %left22  br i1 %cmp, label %end, label %cond.false23 24cond.false:25  %left_or_right = phi i64 [ %left, %start ], [ %right, %cond.true ]26  %false = icmp sgt i64 %left_or_right, %left27  br label %end28 29end:30  %result = phi i1 [ false, %cond.true ], [ %false, %cond.false ]31  ret i1 %result32}33 34define i1 @test_commuted(i1 %cond, i64 %left, i64 %right) {35; CHECK-LABEL: define i1 @test_commuted(36; CHECK-SAME: i1 [[COND:%.*]], i64 [[LEFT:%.*]], i64 [[RIGHT:%.*]]) {37; CHECK-NEXT:  [[START:.*:]]38; CHECK-NEXT:    br i1 [[COND]], label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]39; CHECK:       [[COND_TRUE]]:40; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i64 [[RIGHT]], [[LEFT]]41; CHECK-NEXT:    br i1 [[CMP]], label %[[END:.*]], label %[[COND_FALSE]]42; CHECK:       [[COND_FALSE]]:43; CHECK-NEXT:    br label %[[END]]44; CHECK:       [[END]]:45; CHECK-NEXT:    ret i1 false46;47start:48  br i1 %cond, label %cond.true, label %cond.false49 50cond.true:51  %cmp = icmp sgt i64 %right, %left52  br i1 %cmp, label %end, label %cond.false53 54cond.false:55  %left_or_right = phi i64 [ %left, %start ], [ %right, %cond.true ]56  %false = icmp slt i64 %left, %left_or_right57  br label %end58 59end:60  %result = phi i1 [ false, %cond.true ], [ %false, %cond.false ]61  ret i1 %result62}63 64define i1 @test_with_wrong_icmp(i1 %cond, i64 %left, i64 %right) {65; CHECK-LABEL: define i1 @test_with_wrong_icmp(66; CHECK-SAME: i1 [[COND:%.*]], i64 [[LEFT:%.*]], i64 [[RIGHT:%.*]]) {67; CHECK-NEXT:  [[START:.*]]:68; CHECK-NEXT:    br i1 [[COND]], label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]69; CHECK:       [[COND_TRUE]]:70; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i64 [[RIGHT]], [[LEFT]]71; CHECK-NEXT:    br i1 [[CMP]], label %[[END:.*]], label %[[COND_FALSE]]72; CHECK:       [[COND_FALSE]]:73; CHECK-NEXT:    [[LEFT_OR_RIGHT:%.*]] = phi i64 [ [[LEFT]], %[[START]] ], [ [[RIGHT]], %[[COND_TRUE]] ]74; CHECK-NEXT:    [[FALSE:%.*]] = icmp sge i64 [[LEFT_OR_RIGHT]], [[LEFT]]75; CHECK-NEXT:    br label %[[END]]76; CHECK:       [[END]]:77; CHECK-NEXT:    [[RESULT:%.*]] = phi i1 [ false, %[[COND_TRUE]] ], [ [[FALSE]], %[[COND_FALSE]] ]78; CHECK-NEXT:    ret i1 [[RESULT]]79;80start:81  br i1 %cond, label %cond.true, label %cond.false82 83cond.true:84  %cmp = icmp sgt i64 %right, %left85  br i1 %cmp, label %end, label %cond.false86 87cond.false:88  %left_or_right = phi i64 [ %left, %start ], [ %right, %cond.true ]89  %false = icmp sge i64 %left_or_right, %left90  br label %end91 92end:93  %result = phi i1 [ false, %cond.true ], [ %false, %cond.false ]94  ret i1 %result95}96 97define i1 @test_with_unfoldable_phi(i1 %cond, i64 %left, i64 %right) {98; CHECK-LABEL: define i1 @test_with_unfoldable_phi(99; CHECK-SAME: i1 [[COND:%.*]], i64 [[LEFT:%.*]], i64 [[RIGHT:%.*]]) {100; CHECK-NEXT:  [[START:.*]]:101; CHECK-NEXT:    br i1 [[COND]], label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]102; CHECK:       [[COND_TRUE]]:103; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[RIGHT]], [[LEFT]]104; CHECK-NEXT:    br i1 [[CMP]], label %[[END:.*]], label %[[COND_FALSE]]105; CHECK:       [[COND_FALSE]]:106; CHECK-NEXT:    [[LEFT_OR_RIGHT:%.*]] = phi i64 [ [[LEFT]], %[[START]] ], [ [[RIGHT]], %[[COND_TRUE]] ]107; CHECK-NEXT:    [[FALSE:%.*]] = icmp sgt i64 [[LEFT_OR_RIGHT]], [[LEFT]]108; CHECK-NEXT:    br label %[[END]]109; CHECK:       [[END]]:110; CHECK-NEXT:    [[RESULT:%.*]] = phi i1 [ false, %[[COND_TRUE]] ], [ [[FALSE]], %[[COND_FALSE]] ]111; CHECK-NEXT:    ret i1 [[RESULT]]112;113start:114  br i1 %cond, label %cond.true, label %cond.false115 116cond.true:117  %cmp = icmp slt i64 %right, %left         ; slt instead of sgt here118  br i1 %cmp, label %end, label %cond.false119 120cond.false:121  %left_or_right = phi i64 [ %left, %start ], [ %right, %cond.true ]122  %false = icmp sgt i64 %left_or_right, %left123  br label %end124 125end:126  %result = phi i1 [ false, %cond.true ], [ %false, %cond.false ]127  ret i1 %result128}129 130define i1 @test_which_optimizes_to_select(i1 %cond, i64 %left, i64 %right) {131; CHECK-LABEL: define i1 @test_which_optimizes_to_select(132; CHECK-SAME: i1 [[COND:%.*]], i64 [[LEFT:%.*]], i64 [[RIGHT:%.*]]) {133; CHECK-NEXT:  [[START:.*:]]134; CHECK-NEXT:    br i1 [[COND]], label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]135; CHECK:       [[COND_TRUE]]:136; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp sgt i64 [[RIGHT]], [[LEFT]]137; CHECK-NEXT:    br i1 [[CMP_NOT]], label %[[COND_FALSE]], label %[[END:.*]]138; CHECK:       [[COND_FALSE]]:139; CHECK-NEXT:    br label %[[END]]140; CHECK:       [[END]]:141; CHECK-NEXT:    [[RESULT:%.*]] = phi i1 [ false, %[[COND_TRUE]] ], [ [[COND]], %[[COND_FALSE]] ]142; CHECK-NEXT:    ret i1 [[RESULT]]143;144start:145  br i1 %cond, label %cond.true, label %cond.false146 147cond.true:148  %cmp = icmp sle i64 %right, %left149  br i1 %cmp, label %end, label %cond.false150 151cond.false:152  %left_or_right = phi i64 [ %left, %start ], [ %right, %cond.true ]153  %false = icmp sgt i64 %left_or_right, %left154  br label %end155 156end:157  %result = phi i1 [ false, %cond.true ], [ %false, %cond.false ]158  ret i1 %result159}160