[flang] [llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
dtcxzyw wrote: An unique regression: ``` diff --git a/bench/openssl/optimized/hexstr_test-bin-hexstr_test.ll b/bench/openssl/optimized/hexstr_test-bin-hexstr_test.ll index 534c0a07..85a097fc 100644 --- a/bench/openssl/optimized/hexstr_test-bin-hexstr_test.ll +++ b/bench/openssl/optimized/hexstr_test-bin-hexstr_test.ll @@ -48,7 +48,7 @@ entry: %idxprom = sext i32 %test_index to i64 %arrayidx = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom %0 = load ptr, ptr %arrayidx, align 16 - %sep = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 3 + %sep = getelementptr inbounds i8, ptr %arrayidx, i64 24 %1 = load i8, ptr %sep, align 8 %call = call ptr @ossl_hexstr2buf_sep(ptr noundef %0, ptr noundef nonnull %len, i8 noundef signext %1) #2 %call1 = call i32 @test_ptr(ptr noundef nonnull @.str.3, i32 noundef 71, ptr noundef nonnull @.str.4, ptr noundef %call) #2 @@ -57,9 +57,9 @@ entry: lor.lhs.false:; preds = %entry %2 = load i64, ptr %len, align 8 - %expected = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 1 + %expected = getelementptr inbounds i8, ptr %arrayidx, i64 8 %3 = load ptr, ptr %expected, align 8 - %expected_len = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 2 + %expected_len = getelementptr inbounds i8, ptr %arrayidx, i64 16 %4 = load i64, ptr %expected_len, align 16 %call2 = call i32 @test_mem_eq(ptr noundef nonnull @.str.3, i32 noundef 72, ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.6, ptr noundef %call, i64 noundef %2, ptr noundef %3, i64 noundef %4) #2 %tobool3.not = icmp eq i32 %call2, 0 @@ -93,8 +93,9 @@ entry: store i64 0, ptr %len, align 8 %idxprom = sext i32 %test_index to i64 %arrayidx = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom - %0 = and i32 %test_index, -2 - %cmp.not = icmp eq i32 %0, 2 + %sep = getelementptr inbounds i8, ptr %arrayidx, i64 24 + %0 = load i8, ptr %sep, align 8 + %cmp.not = icmp eq i8 %0, 95 %1 = load ptr, ptr %arrayidx, align 16 %call28 = call ptr @OPENSSL_hexstr2buf(ptr noundef %1, ptr noundef nonnull %len) #2 br i1 %cmp.not, label %if.else26, label %if.then @@ -106,9 +107,9 @@ if.then: ; preds = %entry lor.lhs.false:; preds = %if.then %2 = load i64, ptr %len, align 8 - %expected = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 1 + %expected = getelementptr inbounds i8, ptr %arrayidx, i64 8 %3 = load ptr, ptr %expected, align 8 - %expected_len = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 2 + %expected_len = getelementptr inbounds i8, ptr %arrayidx, i64 16 %4 = load i64, ptr %expected_len, align 16 %call3 = call i32 @test_mem_eq(ptr noundef nonnull @.str.3, i32 noundef 94, ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.6, ptr noundef %call28, i64 noundef %2, ptr noundef %3, i64 noundef %4) #2 %tobool4.not = icmp eq i32 %call3, 0 @@ -122,7 +123,7 @@ lor.lhs.false5: ; preds = %lor.lhs.false br i1 %tobool8.not, label %err, label %if.end if.end: ; preds = %lor.lhs.false5 - %cmp12 = icmp ult i32 %test_index, 2 + %cmp12 = icmp eq i8 %0, 58 br i1 %cmp12, label %if.then14, label %if.else if.then14:; preds = %if.end @@ -171,9 +172,9 @@ entry: land.lhs.true:; preds = %entry %1 = load i64, ptr %len, align 8 - %expected = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 1 + %expected = getelementptr inbounds i8, ptr %arrayidx, i64 8 %2 = load ptr, ptr %expected, align 8 - %expected_len = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 2 + %expected_len = getelementptr inbounds i8, ptr %arrayidx, i64 16 %3 = load i64, ptr %expected_len, align 16 %call3 = call i32 @test_mem_eq(ptr noundef nonnull @.str.3, i32 noundef 122, ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.6, ptr noundef nonnull %buf, i64 noundef %1, ptr noundef %2, i64 noundef %3) #2 %tobool4.not = icmp eq i32 %call3, 0 ``` https://github.com/llvm/llvm-project/pull/68882 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
dtcxzyw wrote: > @dtcxzyw GitHub can't display the diff, and struggles to clone the repo. Can > you share the diffs for just the mentioned files? I have posted the diff between optimized IRs. https://github.com/llvm/llvm-project/pull/68882 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
dtcxzyw wrote: @nikic Could you please have a look at https://github.com/dtcxzyw/llvm-opt-benchmark/pull/17? One regression: ``` diff --git a/bench/brotli/optimized/compound_dictionary.c.ll b/bench/brotli/optimized/compound_dictionary.c.ll index 21fd37fd..b9894810 100644 --- a/bench/brotli/optimized/compound_dictionary.c.ll +++ b/bench/brotli/optimized/compound_dictionary.c.ll @@ -3,9 +3,6 @@ source_filename = "bench/brotli/original/compound_dictionary.c.ll" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -%struct.PreparedDictionary = type { i32, i32, i32, i32, i32, i32 } -%struct.CompoundDictionary = type { i64, i64, [16 x ptr], [16 x ptr], [16 x i64], i64, [16 x ptr] } - ; Function Attrs: nounwind uwtable define hidden ptr @CreatePreparedDictionary(ptr noundef %m, ptr noundef %source, i64 noundef %source_size) local_unnamed_addr #0 { entry: @@ -168,25 +165,29 @@ cond.true119.i: ; preds = %for.end106.i cond.end123.i:; preds = %cond.true119.i, %for.end106.i %cond124.i = phi ptr [ %call121.i, %cond.true119.i ], [ null, %for.end106.i ] - %arrayidx125.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 1 + %arrayidx125.i = getelementptr inbounds i8, ptr %cond124.i, i64 24 %arrayidx127.i = getelementptr inbounds i32, ptr %arrayidx125.i, i64 %idxprom.i %arrayidx129.i = getelementptr inbounds i16, ptr %arrayidx127.i, i64 %idxprom26.i %arrayidx131.i = getelementptr inbounds i32, ptr %arrayidx129.i, i64 %conv113.i store i32 -558043677, ptr %cond124.i, align 4 - %num_items.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 1 + %num_items.i = getelementptr inbounds i8, ptr %cond124.i, i64 4 store i32 %add100.i, ptr %num_items.i, align 4 %conv132.i = trunc i64 %source_size to i32 - %source_size133.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 2 + %source_size133.i = getelementptr inbounds i8, ptr %cond124.i, i64 8 store i32 %conv132.i, ptr %source_size133.i, align 4 - %hash_bits134.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 3 + %hash_bits134.i = getelementptr inbounds i8, ptr %cond124.i, i64 12 store i32 40, ptr %hash_bits134.i, align 4 - %bucket_bits135.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 4 + %bucket_bits135.i = getelementptr inbounds i8, ptr %cond124.i, i64 16 store i32 %bucket_bits.0.lcssa, ptr %bucket_bits135.i, align 4 - %slot_bits136.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 5 + %slot_bits136.i = getelementptr inbounds i8, ptr %cond124.i, i64 20 store i32 %slot_bits.0.lcssa, ptr %slot_bits136.i, align 4 store ptr %source, ptr %arrayidx131.i, align 1 br label %for.body140.i +for.cond151.preheader.i: ; preds = %for.body140.i + %invariant.gep.i = getelementptr i8, ptr %arrayidx129.i, i64 -4 + br label %for.body154.i + for.body140.i:; preds = %for.body140.i, %cond.end123.i %indvars.iv145.i = phi i64 [ 0, %cond.end123.i ], [ %indvars.iv.next146.i, %for.body140.i ] %total_items.1139.i = phi i32 [ 0, %cond.end123.i ], [ %add145.i, %for.body140.i ] @@ -198,10 +199,10 @@ for.body140.i:; preds = %for.body140.i, %con store i32 0, ptr %arrayidx144.i, align 4 %indvars.iv.next146.i = add nuw nsw i64 %indvars.iv145.i, 1 %exitcond150.not.i = icmp eq i64 %indvars.iv.next146.i, %idxprom.i - br i1 %exitcond150.not.i, label %for.body154.i, label %for.body140.i, !llvm.loop !9 + br i1 %exitcond150.not.i, label %for.cond151.preheader.i, label %for.body140.i, !llvm.loop !9 -for.body154.i:; preds = %for.body140.i, %for.inc204.i - %indvars.iv152.i = phi i64 [ %indvars.iv.next153.i, %for.inc204.i ], [ 0, %for.body140.i ] +for.body154.i:; preds = %for.inc204.i, %for.cond151.preheader.i + %indvars.iv152.i = phi i64 [ 0, %for.cond151.preheader.i ], [ %indvars.iv.next153.i, %for.inc204.i ] %5 = trunc i64 %indvars.iv152.i to i32 %and155.i = and i32 %sub3.i, %5 %arrayidx158.i = getelementptr inbounds i16, ptr %arrayidx25.i, i64 %indvars.iv152.i @@ -243,7 +244,7 @@ for.body194.i:; preds = %for.body194.i, %if. %pos.0.in140.i = phi ptr [ %arrayidx189.i, %if.end177.i ], [ %arrayidx198.i, %for.body194.i ] %pos.0.i = load i32, ptr %pos.0.in140.i, align 4 %inc195.i = add nuw nsw i64 %cursor.0142.i, 1 - %arrayidx196.i = getelementptr i32, ptr %arrayidx129.i, i64 %cursor.0142.i + %arrayidx196.i = getelementptr inbounds i32, ptr %arrayidx129.i, i64 %cursor.0142.i store i32 %pos.0.i, ptr %arrayidx196.i, align 4 %idxprom197.i = zext i32