brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 63ec09b Raw
164 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; These xor-of-icmps could be replaced with and-of-icmps, but %cond0 has extra5; uses, so we don't consider it, even though some cases are freely invertible.6 7; %cond0 is extra-used in select, which is freely invertible.8define i1 @v0_select_of_consts(i32 %X, ptr %selected) {9; CHECK-LABEL: @v0_select_of_consts(10; CHECK-NEXT:    [[COND0_INV:%.*]] = icmp sgt i32 [[X:%.*]], 3276711; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND0_INV]], i32 32767, i32 -3276812; CHECK-NEXT:    store i32 [[SELECT]], ptr [[SELECTED:%.*]], align 413; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X]], 3276714; CHECK-NEXT:    [[RES:%.*]] = icmp ult i32 [[TMP1]], 6553515; CHECK-NEXT:    ret i1 [[RES]]16;17  %cond0 = icmp sgt i32 %X, 3276718  %cond1 = icmp sgt i32 %X, -3276819  %select = select i1 %cond0, i32 32767, i32 -3276820  store i32 %select, ptr %selected21  %res = xor i1 %cond0, %cond122  ret i1 %res23}24define i1 @v1_select_of_var_and_const(i32 %X, i32 %Y, ptr %selected) {25; CHECK-LABEL: @v1_select_of_var_and_const(26; CHECK-NEXT:    [[COND0:%.*]] = icmp slt i32 [[X:%.*]], 3276827; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND0]], i32 -32768, i32 [[Y:%.*]]28; CHECK-NEXT:    store i32 [[SELECT]], ptr [[SELECTED:%.*]], align 429; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X]], 3276730; CHECK-NEXT:    [[RES:%.*]] = icmp ult i32 [[TMP1]], 6553531; CHECK-NEXT:    ret i1 [[RES]]32;33  %cond0 = icmp sgt i32 %X, 3276734  %cond1 = icmp sgt i32 %X, -3276835  %select = select i1 %cond0, i32 %Y, i32 -3276836  store i32 %select, ptr %selected37  %res = xor i1 %cond0, %cond138  ret i1 %res39}40define i1 @v2_select_of_const_and_var(i32 %X, i32 %Y, ptr %selected) {41; CHECK-LABEL: @v2_select_of_const_and_var(42; CHECK-NEXT:    [[COND0_INV:%.*]] = icmp sgt i32 [[X:%.*]], 3276743; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND0_INV]], i32 32767, i32 [[Y:%.*]]44; CHECK-NEXT:    store i32 [[SELECT]], ptr [[SELECTED:%.*]], align 445; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X]], 3276746; CHECK-NEXT:    [[RES:%.*]] = icmp ult i32 [[TMP1]], 6553547; CHECK-NEXT:    ret i1 [[RES]]48;49  %cond0 = icmp sgt i32 %X, 3276750  %cond1 = icmp sgt i32 %X, -3276851  %select = select i1 %cond0, i32 32767, i32 %Y52  store i32 %select, ptr %selected53  %res = xor i1 %cond0, %cond154  ret i1 %res55}56 57; Branch is also freely invertible58define i1 @v3_branch(i32 %X, ptr %dst0, ptr %dst1) {59; CHECK-LABEL: @v3_branch(60; CHECK-NEXT:  begin:61; CHECK-NEXT:    [[COND0:%.*]] = icmp slt i32 [[X:%.*]], 3276862; CHECK-NEXT:    br i1 [[COND0]], label [[BB1:%.*]], label [[BB0:%.*]]63; CHECK:       bb0:64; CHECK-NEXT:    store i32 0, ptr [[DST0:%.*]], align 465; CHECK-NEXT:    br label [[END:%.*]]66; CHECK:       bb1:67; CHECK-NEXT:    store i32 0, ptr [[DST1:%.*]], align 468; CHECK-NEXT:    br label [[END]]69; CHECK:       end:70; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[X]], 3276771; CHECK-NEXT:    [[RES:%.*]] = icmp ult i32 [[TMP0]], 6553572; CHECK-NEXT:    ret i1 [[RES]]73;74begin:75  %cond0 = icmp sgt i32 %X, 3276776  %cond1 = icmp sgt i32 %X, -3276877  br i1 %cond0, label %bb0, label %bb178bb0:79  store i32 0, ptr %dst080  br label %end81bb1:82  store i32 0, ptr %dst183  br label %end84end:85  %res = xor i1 %cond0, %cond186  ret i1 %res87}88 89; Can invert 'not'.90define i1 @v4_not_store(i32 %X, ptr %not_cond) {91; CHECK-LABEL: @v4_not_store(92; CHECK-NEXT:    [[COND0:%.*]] = icmp slt i32 [[X:%.*]], 3276893; CHECK-NEXT:    store i1 [[COND0]], ptr [[NOT_COND:%.*]], align 194; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X]], 3276795; CHECK-NEXT:    [[RES:%.*]] = icmp ult i32 [[TMP1]], 6553596; CHECK-NEXT:    ret i1 [[RES]]97;98  %cond0 = icmp sgt i32 %X, 3276799  %not_cond0 = xor i1 %cond0, -1100  store i1 %not_cond0, ptr %not_cond101  %cond1 = icmp sgt i32 %X, -32768102  %select = select i1 %cond0, i32 32767, i32 -32768103  %res = xor i1 %cond0, %cond1104  ret i1 %res105}106 107; All extra uses are invertible.108define i1 @v5_select_and_not(i32 %X, i32 %Y, ptr %selected, ptr %not_cond) {109; CHECK-LABEL: @v5_select_and_not(110; CHECK-NEXT:    [[COND0:%.*]] = icmp slt i32 [[X:%.*]], 32768111; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND0]], i32 [[Y:%.*]], i32 32767112; CHECK-NEXT:    store i1 [[COND0]], ptr [[NOT_COND:%.*]], align 1113; CHECK-NEXT:    store i32 [[SELECT]], ptr [[SELECTED:%.*]], align 4114; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X]], 32767115; CHECK-NEXT:    [[RES:%.*]] = icmp ult i32 [[TMP1]], 65535116; CHECK-NEXT:    ret i1 [[RES]]117;118  %cond0 = icmp sgt i32 %X, 32767119  %cond1 = icmp sgt i32 %X, -32768120  %select = select i1 %cond0, i32 32767, i32 %Y121  %not_cond0 = xor i1 %cond0, -1122  store i1 %not_cond0, ptr %not_cond123  store i32 %select, ptr %selected124  %res = xor i1 %cond0, %cond1125  ret i1 %res126}127 128; Not all extra uses are invertible.129define i1 @n6_select_and_not(i32 %X, i32 %Y, ptr %selected, ptr %not_cond) {130; CHECK-LABEL: @n6_select_and_not(131; CHECK-NEXT:    [[COND0:%.*]] = icmp sgt i32 [[X:%.*]], 32767132; CHECK-NEXT:    [[COND1:%.*]] = icmp sgt i32 [[X]], -32768133; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND0]], i32 32767, i32 [[Y:%.*]]134; CHECK-NEXT:    store i1 [[COND0]], ptr [[NOT_COND:%.*]], align 1135; CHECK-NEXT:    store i32 [[SELECT]], ptr [[SELECTED:%.*]], align 4136; CHECK-NEXT:    [[RES:%.*]] = xor i1 [[COND0]], [[COND1]]137; CHECK-NEXT:    ret i1 [[RES]]138;139  %cond0 = icmp sgt i32 %X, 32767140  %cond1 = icmp sgt i32 %X, -32768141  %select = select i1 %cond0, i32 32767, i32 %Y142  store i1 %cond0, ptr %not_cond143  store i32 %select, ptr %selected144  %res = xor i1 %cond0, %cond1145  ret i1 %res146}147 148; Not freely invertible, would require extra 'not' instruction.149define i1 @n7_store(i32 %X, ptr %cond) {150; CHECK-LABEL: @n7_store(151; CHECK-NEXT:    [[COND0:%.*]] = icmp sgt i32 [[X:%.*]], 32767152; CHECK-NEXT:    store i1 [[COND0]], ptr [[COND:%.*]], align 1153; CHECK-NEXT:    [[COND1:%.*]] = icmp sgt i32 [[X]], -32768154; CHECK-NEXT:    [[RES:%.*]] = xor i1 [[COND0]], [[COND1]]155; CHECK-NEXT:    ret i1 [[RES]]156;157  %cond0 = icmp sgt i32 %X, 32767158  store i1 %cond0, ptr %cond159  %cond1 = icmp sgt i32 %X, -32768160  %select = select i1 %cond0, i32 32767, i32 -32768161  %res = xor i1 %cond0, %cond1162  ret i1 %res163}164