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