brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 5ddd0b9 Raw
63 lines · plain
1; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -disable-cgp-branch-opts -S < %s | FileCheck %s2target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"3target triple = "x86_64-unknown-linux-gnu"4 5; The first cast should be sunk into block2, in order that the6; instruction selector can form an efficient7; ptr i64 -> i128 multiplication.8define i128 @sink(ptr %mem1, ptr %mem2) {9; CHECK-LABEL: block1:10; CHECK-NEXT: load11block1:12  %l1 = load i64, ptr %mem113  %s1 = sext i64 %l1 to i12814  br label %block215 16; CHECK-NEXT: sext17; CHECK-NEXT: load18; CHECK-NEXT: sext19block2:20  %l2 = load i64, ptr %mem221  %s2 = sext i64 %l2 to i12822  %res = mul i128 %s1, %s223  ret i128 %res24}25 26; The first cast should be hoisted into block1, in order that the27; instruction selector can form an extend-load.28define i64 @hoist(ptr %mem1, ptr %mem2) {29; CHECK-LABEL: block1:30; CHECK-NEXT: load31; CHECK-NEXT: sext32block1:33  %l1 = load i32, ptr %mem134  br label %block235 36; CHECK-NEXT: load37; CHECK-NEXT: sext38block2:39  %s1 = sext i32 %l1 to i6440  %l2 = load i32, ptr %mem241  %s2 = sext i32 %l2 to i6442  %res = mul i64 %s1, %s243  ret i64 %res44}45 46; Make sure the cast sink logic and OptimizeExtUses don't end up in an infinite47; loop.48define i128 @use_ext_source(i1 %arg) {49block1:50  %v1 = or i64 undef, undef51  %v2 = zext i64 %v1 to i12852  br i1 %arg, label %block2, label %block353 54block2:55  %v3 = add i64 %v1, 156  %v4 = zext i64 %v3 to i12857  br label %block358 59block3:60  %res = phi i128 [ %v2, %block1 ], [ %v4, %block2 ]61  ret i128 %res62}63