Home | History | Annotate | Download | only in AArch64
      1 ; RUN: opt -codegenprepare < %s -S | FileCheck %s
      2 
      3 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
      4 target triple = "aarch64--linux-gnu"
      5 
      6 %struct.match_state = type { i64, i64  }
      7 
      8 ; %add is also promoted by forking an extra sext.
      9 define void @promoteTwoOne(i32 %i, i32 %j, i64* %P1, i64* %P2 ) {
     10 ; CHECK-LABEL: @promoteTwoOne
     11 ; CHECK-LABEL: entry:
     12 ; CHECK: %[[SEXT1:.*]] = sext i32 %i to i64
     13 ; CHECK: %[[SEXT2:.*]] = sext i32 %j to i64
     14 ; CHECK: %add = add nsw i64 %[[SEXT1]], %[[SEXT2]]
     15 entry:
     16   %add = add nsw i32 %i, %j
     17   %s = sext i32 %add to i64
     18   %addr1 = getelementptr inbounds i64, i64* %P1, i64 %s
     19   store i64 %s, i64* %addr1
     20   %s2 = sext i32 %i to i64
     21   %addr2 = getelementptr inbounds i64, i64* %P2, i64 %s2
     22   store i64 %s2, i64* %addr2
     23   ret void
     24 }
     25 
     26 ; Both %add1 and %add2 are promoted by forking extra sexts.
     27 define void @promoteTwoTwo(i32 %i, i32 %j, i32 %k, i64* %P1, i64* %P2) {
     28 ; CHECK-LABEL: @promoteTwoTwo
     29 ; CHECK-LABEL:entry:
     30 ; CHECK: %[[SEXT1:.*]] = sext i32 %j to i64
     31 ; CHECK: %[[SEXT2:.*]]  = sext i32 %i to i64
     32 ; CHECK: %add1 = add nsw i64 %[[SEXT1]], %[[SEXT2]]
     33 ; CHECK: %[[SEXT3:.*]] = sext i32 %k to i64
     34 ; CHECK: %add2 = add nsw i64 %[[SEXT1]], %[[SEXT3]]
     35 entry:
     36   %add1 = add nsw i32 %j, %i
     37   %s = sext i32 %add1 to i64
     38   %addr1 = getelementptr inbounds i64, i64* %P1, i64 %s
     39   store i64 %s, i64* %addr1
     40   %add2 = add nsw i32 %j, %k
     41   %s2 = sext i32 %add2 to i64
     42   %addr2 = getelementptr inbounds i64, i64* %P2, i64 %s2
     43   store i64 %s2, i64* %addr2
     44   ret void
     45 }
     46 
     47 define i64 @promoteGEPSunk(i1 %cond, i64* %base, i32 %i) {
     48 ; CHECK-LABEL: @promoteGEPSunk
     49 ; CHECK-LABEL: entry:
     50 ; CHECK:  %[[SEXT:.*]] = sext i32 %i to i64
     51 ; CHECK:  %add = add nsw i64 %[[SEXT]], 1
     52 ; CHECK:  %add2 = add nsw i64 %[[SEXT]], 2
     53 entry:
     54   %add = add nsw i32 %i, 1
     55   %s = sext i32 %add to i64
     56   %addr = getelementptr inbounds i64, i64* %base, i64 %s
     57   %add2 = add nsw i32 %i,  2
     58   %s2 = sext i32 %add2 to i64
     59   %addr2 = getelementptr inbounds i64, i64* %base, i64 %s2
     60   br i1 %cond, label %if.then, label %if.then2
     61 if.then:
     62   %v = load i64, i64* %addr
     63   %v2 = load i64, i64* %addr2
     64   %r = add i64 %v, %v2
     65   ret i64 %r
     66 if.then2:
     67   ret i64 0;
     68 }
     69