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